分支限界法採用的是廣度優先搜尋,而優先佇列採用的是佇列裡最優的出隊,這裡可以使用最大堆來實現活接墊優先佇列,最大堆以活節點的界值作為優先順序。
左子樹的解的上界與父節點相同,不用計算。右子樹的解的界值是:將剩餘物品以其單位重量價值排序,然後依次裝入物品,直到裝不下時,再裝入物品的一部分來裝滿揹包,即採用貪心演算法算出最大值,由此得到右子樹中解的上界(雖然不是乙個可行解,但可以作為最優解的上界)。
double
bound
(int i)
// 裝填剩餘容量裝滿揹包
if(i <= n)
b = b + p[i]
/ w[i]
* cleft;
return b;
}// addlivenode將乙個新的活結點插入到子集樹和優先佇列中
void
addlivenode
(double up,
double pp,
double ww,
int lev, bbnode* par, bool ch)
double
maxknapsack()
up =
bound
(i +1)
;if(up >= bestp)
addlivenode
(up, cp, cw, i +
1, enode, false)
; heapnode node = heap->
removemax()
; enode = node.livenode;
cw = node.weight;
cp = node.profit;
up = node.upperprofit;
i = node.level;
}for
(int j = n; j >
0; j--
)return cp;
}double
knapsack
(double
* pp,
double
* ww,
double cc,
int* xx)
if(ws <= c)
p = new double
[n +1]
; w = new double
[n +1]
;for
(int i =
0; i < n; i++
) cw =
0.0;
cp =
0.0;
bestx = new int
[n +1]
; heap = new maxheap
(n);
double bestp =
maxknapsack()
;for
(int j =
0; j < n; j++
) xx[q[j]
.id]
= bestx[j +1]
;return bestp;
}
佇列式分支限界法 裝載問題
今晚終於把老師發布的演算法題的思路理清楚了,很是開心。這次的演算法是用佇列式分支限界法解決裝載問題。下面對於演算法的幾乎每一步都給了詳細解釋。需要的同學可以借鑑一下。嘻嘻。希望大家一起共同進步呀 佇列式分支限界法 貨櫃問題 public class fifobbloding 佇列類 private ...
優先佇列式分支限界法 最小重量機器設計問題
問題描述 設某一機器由n個部件組成,每一種部件都可以從m個不同的 商處購得。設是從 商j處購得的部件i的重量,是相應的 試設計乙個優先佇列式分支限界法,給出總 不超過d的最小重量機器設計。之所以想記錄這個問題,是因為我覺得自己 用各個部件的最小重量作為未來最理想重量 的這個設計還挺特別。其他都是實驗...
0 1揹包問題 分支限界法 優先佇列分支限界法
演算法首先根據基於可行結點相應的子樹最大價值上界優先順序,從堆中選擇乙個節點 根節點 作為當前可擴充套件結點。檢查當前擴充套件結點的左兒子結點的可行性。如果左兒子結點是可行結點,則將它加入到子集樹和活結點優先佇列中。當前擴充套件結點的右兒子結點一定是可行結點,僅當右兒子結點滿足上界函式約束時,才將它...