分枝定界法解0 1揹包問題

2022-02-07 07:40:44 字數 1531 閱讀 4115

分枝定界法按照樹形結構來組織解空間,展開節點後,有兩種策略:

策略

一、把節點加入 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...