回溯演算法 01揹包問題 Java實現

2021-07-08 22:25:14 字數 2072 閱讀 4520

回溯演算法也叫試探法,通俗的將就是乙個方向的路一直往前走,能走則走,不能走則退回來換乙個方向再試。一般的實現步驟是:針對乙個問題定**的空間,至少包含問題的乙個最優解;用易於搜尋的解空間結構,使得能用回溯方法搜尋整個解空間;以深度優先的方式搜尋整個解空間,並在搜尋過程中通過剪枝函式避免無效搜尋。

如上圖所示,每個節點均有左右兩種選擇,最終要實現結果會產生ah、ai、aj、ak、al、am、an和ao八種實現方案,需要確定哪種方案為最優方案。以左邊的條件為首要條件進行判斷,那麼其搜尋路線為:【a】→【b】→【d】→【h】→【i】→【e】→【j】→【k】→【c】→【f】→【l】→【m】→【g】→【n】→【o】,即在全部滿足限制條件的前提下,實現每個節點之間的兩兩比較,最終選擇出最優方案。

乙個旅行者有乙個最多能裝m公斤的揹包,現在有n中物品,每件的重量分別是w1、w2、……、wn,每件物品的價值分別為c1、c2、……、cn, 需要將物品放入揹包中,要怎麼樣放才能保證揹包中物品的總價值最大?

上述問題包含兩種情況,一種是將物品放入揹包中,另一種是不將物品放入揹包中。其中隱含著三個限制條件。第乙個限制條件為放入物品的總和不能超過揹包的總承重,即當放入的物品總和超過揹包的總承重時,即使揹包中物品的總價值再大也毫無意義。第二個限制條件為要保證揹包中物品的總價值最大。無論第乙個條件成不成立,第二個條件總是在其之上的一種更優的選擇。第三個限制條件為當達到物品的數量上限,即沒有可以獲取物品再放入揹包時,前兩個限制條件均毫無意義,因此需要優先進行判斷。

這裡我們可以將第一種情況看做左節點,第二種情況看做右節點,第三個限制條件用於終結節點的搜尋。因此在解決該問題時,首先需要判斷是否有物品可以放到揹包中,要是沒有物品可以放到揹包中,直接返回結果,當前的價值即為揹包的最優價值。然後判斷左節點是否為可行節點,當左節點可行,就優先搜尋左子樹,不滿足則進入右子樹。當達到物品的數量上限,直接返回當前物品數量的結果;若左右節點同時不可行,則直接將結果返回上一步。以此類推,將結果從下至上一層一層進行返回,得到問題的最優結果。

建立乙個物品物件,分別存在價值、重量以及單位重量價值三種屬性。

public class knapsack implements comparable

public int getweight()

public void setweight(int weight)

public int getvalue()

public void setvalue(int value)

public int getunitvalue()

@override

public int compareto(knapsack snapsack)

}

按照回溯演算法將物品放入揹包中。

public class hssfproblem 

public int solve(int i)

// 首要條件:放入當前物品,判斷物品放入揹包後是否小於揹包的總承重

if (currweight + bags[i].getweight() <= totalweight)

// 當前價值+剩餘價值<=最優價值,不需考慮右子樹情況,由於最優價值的結果是由小往上逐層返回,

// 為了防止錯誤的將單位重量價值大的物品錯誤的剔除,需要將物品按照單位重量價值從大到小進行排序

if (currvalue + getsurplusvalue(i + 1) > bestvalue)

return bestvalue;

}// 獲得物品的剩餘總價值

public int getsurplusvalue(int i)

}

最終測試結果:90

public class hssftest ;

int totalweight = 12;

hssfproblem problem = new hssfproblem(bags, totalweight);

system.out.println(problem.solve(0));

}

0 1揹包問題 回溯演算法 java實現

有n種可選物品1,n 放入容量為c的揹包內,使裝入的物品具有最大效益。表示n 物品個數 c 揹包容量 p1,p2,pn 個體物品效益值 w1,w2,wn 個體物品容量 0 1揹包問題的解指 物品1,n的一種放法 x1,xn的0 1賦值 使得效益值最大。假定揹包容量不足以裝入所有物品 面臨選擇 優化原...

回溯演算法 0 1揹包問題

給定乙個物品集合s 1,2,3,n 物品i的重量是wi,其價值是vi,揹包的容量為w,即最大載重量不超過w。在限定的總重量w內,我們如何選擇物品,才能使得物品的總價值最大。0 1揹包問題回溯演算法的資料結構 define num 100 int c 揹包的容量 int n 物品的數量 int cw ...

回溯演算法 01揹包問題

假期 2020.01 200 1揹包問題一般描述為 給定n種物品和乙個揹包。物品i的重量是w i 其價值為v i 揹包的容量為c。問應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大?注 每個物品只能使用一次。這次分析01揹包問題,採用回溯的方法實現。簡單的來說,回溯就是採用dfs然後加上...