分枝定界法按照樹形結構來組織解空間,展開節點後,有兩種策略:
策略
一、把節點加入 fifo 佇列當中;
策略
二、把節點加入到堆中,按照最小消耗或者最大消耗來選擇下乙個展開節點。
分枝定界法是一類能確保搜尋到全部可行解的解空間的一類方法。得到全部的解以後,再由後續程式自行覺得。
分枝定界法
回溯法搜尋解空間的方法是 bfs(廣度優先)
搜尋解空間的方法是 dfs(深度優先)
演算法搜尋的解空間大,消耗的記憶體多
演算法搜尋的解空間大,消耗的記憶體少
有揹包問題形式化描述如下:
\[n = 3 \\
weights = [20, 15, 15] \\
values = [40, 25, 25] \\
constraint = 30
\]用分枝定界法,**實現如下:
# -*- coding:utf8 -*-
import copy
from collections import deque
# 用分枝定界法解決0/1揹包問題
def brunch_bound(w, p, c):
plan = list()
buffer = deque([[copy.copy(w), , ]]) # [waiting, explored, values]
while len(buffer):
cur = buffer.popleft()
for i in range(0, len(cur[0])):
weight = cur[0][i]
n = copy.deepcopy(cur)
n[0].remove(weight)
if sum(n[1]) > c:
continue # overloaded
return plan
if __name__ == '__main__':
w = [20, 15, 15]
p = [40, 25, 25]
c = 30
plan = brunch_bound(w,p,c)
l = sorted(plan, key=lambda x:sum(x[2]), reverse=true) # l[0] is the most value plan
for e in l:
print(e)
輸出:
[[20], [15, 15], [25, 25]] #顯然,這是最優方案
[[20], [15, 15], [25, 25]]
[[15, 15], [20], [40]]
[[20, 15], [15], [25]]
[[20, 15], [15], [25]]
[[20, 15, 15], , ]
copy.copy 是淺拷貝,子物件不會被拷貝
copy.deepcopy 是深拷貝
回溯法解01揹包問題
關於回溯法的概念,這篇文章講的比較通俗易懂 package com.zxg.algorithm.backtrack 回溯法解01揹包問題 揹包問題的概念不再贅述。這裡主要講解下回溯法思路。將每乙個物品分為裝載和不裝載兩條路徑,乙個接乙個的遍歷,每遍歷乙個物品就會產生兩條分支 那麼就會組成一棵樹,深度...
1044 用分枝定界法求解TSP問題
用分枝定界法求解tsp問題 time limit 1000ms memory limit 65536k total submit 15 accepted 7 description 已知n個城市之間的相互距離,現有一推銷員必須遍訪這n個城市,並且每個城市只能訪問一次,最後又必須返回出發城市。如何安排...
分支限界法01揹包問題 01揹包問題
1.01揹包問題的描述 有n個不可分割的物品,它們有各自的重量和價值,現有固定容量的揹包,選擇把哪些物品放入揹包可以讓揹包中物品的價值最大。2.錯覺 按照價值和重量的比值 價效比 進行排序,依次嘗試放入直到放不進揹包為止。但是細想思考一下就能發現,這個貪心演算法是有問題的,看下面乙個例子。揹包容量1...