日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

限界分支法(队列方式)追踪解:01背包问题

發布時間:2024/9/15 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 限界分支法(队列方式)追踪解:01背包问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

追蹤解

追蹤解,上述實現的情況下,解都在最后一層,根本不知道之前的路徑是怎樣的,廣度優先搜索,同一個緯度,假如不加指標判斷的話,根本不知道最優解是選擇的哪一個,所以需要同一個緯度的每一個結點,記住他之前的路徑,才能在最優解的時候之前是怎么走過來的,每一個結點用一個數組記錄路徑,這樣實現的感覺消耗有點大啊,通常看見是采用鏈表方式

限界分支法本質還是空間樹,樹的話,還是用鏈表實現比較容易和直觀

把之前實現基于數組的形式修改成結點鏈表方式

實現如下:

#%% # 修改成結點,為了追蹤解,新增兩個變量,是否選擇物品和前一個物品的結點 class Node:def __init__(self, CurCost=None,CurValue=None,Flag=None,parent=None):# 部分解所占體積self.CurCost = CurCost# 部分解所占價值self.CurValue = CurValue# 當前結點是否選擇了物品self.isleft = Flag# 前一個結點是誰self.parent = parentclass FIFO_01_Pack_with_solution_tracking:def __init__(self,N,V,C,W):self.num =Nself.Volume = Vself.Cost = Cself.Value = W# 存放最優解self.BestResult = [False]*N # 最優解結點,這里是葉子結點self.BestNode = Node(0,0,False,None)#用于存放活結點,便于理解,把根結點,以及第0層結束標志-1放進去# 結點包括2個屬性:當前空間大小,當前的價值大小self.queue = [Node(0,0,False,None),Node(-1,-1,False,None),] # 實現時葉子結點不加入到活結點列表,當屬于葉子結點時,增加對結果的處理def enQueen(self,node,depth):if depth == self.num -1:CurValue = node.CurValueif CurValue > self.BestNode.CurValue:self.BestNode.CurValue = CurValueself.BestNode.isleft = node.isleftself.BestNode.parent = node.parent else:self.queue.append(node)def pack_01(self): # selected = [0]*self.num # 首先取出根結點depth = 0node = self.queue.pop(0)CurCost = node.CurCostCurValue = node.CurValuewhile True:# 判斷左結點能否加入到隊列,能的話,把當前空間和當前價值放入隊列if CurCost + self.Cost[depth] < self.Volume:# 這時的父節點就是nodeself.enQueen(Node(CurCost + self.Cost[depth],CurValue + self.Value[depth],True,node),depth)# 右結點總是可以加入隊列的,因為沒有約束條件的限制self.enQueen(Node(CurCost,CurValue,False,node),depth)# 然后彈出下一個結點node = self.queue.pop(0)CurCost = node.CurCostCurValue = node.CurValue# 當同一層處理完畢時,先判斷是否能夠輸出結果,判斷的標準是隊列是否為空,# 這時下一層的所有結點已經加入了隊列,這時需要把下一層# 增加一個結尾-1便于判斷,然后進入下一層,彈出下一個結點if CurCost == -1:if not self.queue:return self.BestNode.CurValueself.enQueen(Node(-1,-1,False,None),depth)depth += 1node = self.queue.pop(0)CurCost = node.CurCostCurValue = node.CurValuedef solution_Tracking(self):#追蹤解從self.BestNode開始追蹤for j in range(self.num-1,-1,-1):self.BestResult[j] = self.BestNode.isleftself.BestNode = self.BestNode.parentreturn self.BestResultdef print_Result(self):print(self.pack_01())print(self.solution_Tracking())N = 8 V = 30 C = [11,2,3,9,13,6,15,7,19] W = [5.0,2.0,5.0,7.0,5.0,11.0,6.0,14.0]FIFO_01_Pack_with_solution_tracking(N,V,C,W).print_Result()39.0 [False, True, True, True, False, True, False, True]

總結

以上是生活随笔為你收集整理的限界分支法(队列方式)追踪解:01背包问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。