演算法實驗 優先佇列式分支限界法解01揹包問題

2021-10-02 16:50:45 字數 1534 閱讀 5189

分支限界法採用的是廣度優先搜尋,而優先佇列採用的是佇列裡最優的出隊,這裡可以使用最大堆來實現活接墊優先佇列,最大堆以活節點的界值作為優先順序。

左子樹的解的上界與父節點相同,不用計算。右子樹的解的界值是:將剩餘物品以其單位重量價值排序,然後依次裝入物品,直到裝不下時,再裝入物品的一部分來裝滿揹包,即採用貪心演算法算出最大值,由此得到右子樹中解的上界(雖然不是乙個可行解,但可以作為最優解的上界)。

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揹包問題 分支限界法 優先佇列分支限界法

演算法首先根據基於可行結點相應的子樹最大價值上界優先順序,從堆中選擇乙個節點 根節點 作為當前可擴充套件結點。檢查當前擴充套件結點的左兒子結點的可行性。如果左兒子結點是可行結點,則將它加入到子集樹和活結點優先佇列中。當前擴充套件結點的右兒子結點一定是可行結點,僅當右兒子結點滿足上界函式約束時,才將它...