演算法詳解(五) 分支界限 裝載問題

2021-10-01 07:01:48 字數 4693 閱讀 6237

優先佇列

優先佇列

class

node

:def

__init__

(self, index, bestw, upbound)

:"""

:param index: 表示第幾個物品

:param upbound: 表明當前物品的裝載上限

:param bestw: 表明最優裝載量

"""self.index = index

self.bestw = bestw

self.upbound = upbound

def

__init__

(self, ship_one, ship_two, num)

:"""

:param bestw_list: 主要用來儲存該階段的策略

:param h: 儲存大根堆

:param weight: 用來儲存貨物的總重量

:param ship_one, ship_two: 表示兩艘船承受的總重量

:param num: 儲存總和

:param count:表示入隊順序

"""self.bestw =

0 self.num = num

self.h =

self.weight =[0

] self.ship_one = ship_one

self.ship_two = ship_two

self.

sum=

0 self.count =

0

④判斷佇列是否為空

def

function

(self)

: node = node(0,

0, self.

sum)

(-node.upbound, self.count, node)

) self.count +=

1while

true:if

len(self.h)==0

:break

node =)[

2]if node.bestw > self.bestw:

self.bestw = node.bestw

if node.index != self.num:

if node.bestw + self.weight[node.index +1]

<= self.ship_one and node.upbound >= self.bestw:

node_left = node(node.index +

1, node.bestw + self.weight[node.index +1]

, node.upbound)

(-node_left.upbound, self.count, node_left)

) self.count +=

1if node.upbound - self.weight[node.index +1]

> self.bestw:

node_right = node(node.index +

1, node.bestw, node.upbound - self.weight[node.index +1]

)(-node_right.upbound, self.count, node_right)

) self.count +=

1

class

node

:def

__init__

(self, index, bestw, upbound)

:"""

:param index: 表示第幾個物品

:param upbound: 表明當前物品的裝載上限

:param bestw: 表明最優裝載量

"""self.index = index

self.bestw = bestw

self.upbound = upbound

class

loading

:def

__init__

(self, ship_one, ship_two, num)

:"""

:param bestw_list: 主要用來儲存該階段的策略

:param h: 儲存大根堆

:param weight: 用來儲存貨物的總重量

:param ship_one, ship_two: 表示兩艘船承受的總重量

:param num: 儲存總和

:param count:表示入隊順序

"""self.bestw =

0 self.num = num

self.h =

self.weight =[0

] self.ship_one = ship_one

self.ship_two = ship_two

self.

sum=

0 self.count =

0def

function

(self)

: node = node(0,

0, self.

sum)

(-node.upbound, self.count, node)

) self.count +=

1while

true:if

len(self.h)==0

:break

node =)[

2]if node.bestw > self.bestw:

self.bestw = node.bestw

if node.index != self.num:

if node.bestw + self.weight[node.index +1]

<= self.ship_one and node.upbound >= self.bestw:

node_left = node(node.index +

1, node.bestw + self.weight[node.index +1]

, node.upbound)

(-node_left.upbound, self.count, node_left)

) self.count +=

1if node.upbound - self.weight[node.index +1]

> self.bestw:

node_right = node(node.index +

1, node.bestw, node.upbound - self.weight[node.index +1]

)(-node_right.upbound, self.count, node_right)

) self.count +=

1def

input

(self, num)

:with

open

("weight.txt"

,"r"

)as f:

for i in

range

(num)

:int

(f.readline())

) f.close(

)for i in

range

(num +1)

: self.

sum+= self.weight[i]

defoutput

(self)

:if self.

sum> self.ship_one + self.ship_two:

print

("貨物過多,裝載不完"

)print

("第一艘船的裝載貨物重量為:"

.format

(self.bestw)

)if self.

sum> self.bestw:

print

("第二艘船裝不完所有所有貨物"

)else

:print

("第二艘船的裝載重量為:"

.format

(self.

sum- self.bestw)

)if __name__ ==

"__main__"

: ship_one =

int(

input

("請輸入第一艘船的裝載量:"))

ship_two =

int(

input

("請輸入第二艘船的裝載量:"))

num =

int(

input

("請輸入貨物的數量:"))

loading = loading(ship_one=ship_one, ship_two=ship_two, num=num)

loading.

input

(num=num)

loading.function(

) loading.output(

)

裝載問題 BFS(佇列式)分支界限法

bfs即佇列分支界限法 如下 include include include using namespace std typedef struct node node int c 最大裝載重量 int n 裝載個數 int bestw 0 最佳裝載重量 int ew 0 當前裝載重量 int wei...

裝載問題 優先順序佇列分支界限法

include include include using namespace std typedef struct node node struct cmp int c 最大裝載重量 int n 裝載個數 int bestw 0 最佳裝載重量 int ew 0 當前裝載重量 int weight ...

Git學習系列 五 分支管理詳解

分支管理在咱們實際工作中經常用到,因此掌握分支對於咱們從事移動開發並且使用到了git這樣的分布式版本管理工具來說是很有必要的。比如當你餓了的時候,甲幫你做飯,一幫你燒菜 當然你也可以自己做飯燒菜。但是咱們仍然可以看到,我是從乙個餓的狀態變成了乙個飽的狀態,也就是我之前空腹,後來我由甲 分支 和乙 分...