本人此時還是一名研一的小菜雞,剛學會了這個算法的基本概念,來總結一下,誰知道今後的我再看到這篇自己寫的博客的時候會不會笑出來,哈哈哈哈哈哈哈哈,所以嗎,錯了的化大佬們評論指正就好了。
還有系列文章動態規劃法解01揹包問題,回溯法解01揹包問題哈,需要的化以下是鏈接:
動態規劃法:https://blog.csdn.net/qq_29051107/article/details/103394491
回溯法:https://blog.csdn.net/qq_29051107/article/details/103395285
1揹包問題題幹(題目中所給出的條件和問題)
給定n種物品和一揹包。物品i的體積是Si,其價值爲Vi,揹包的容量爲C。問應如何選擇裝入揹包的物品,使得裝入揹包中物品的總價值最大?
物品的個數n=3,揹包容量C = 30, S =(16,15,15),價值W =(45,25,25)
2分支限界法求解
回溯法以深度優先的方式搜索解空間樹,而分支限界法則以廣度優先或以最小耗費優先的方式搜索解空間樹。
常見的兩種分支限界法
(1)隊列式(FIFO)分支限界法:按照隊列先進先出(FIFO)原則選取下一個結點爲擴展結點。
(2)優先隊列式分支限界法:按照優先隊列中規定的優先級選取優先級最高的結點成爲當前擴展結點。
第一種:隊列式(FIFO)分支限界法解法:
按照隊列先進先出(FIFO)原則選取下一個結點爲擴展結點
隊列空 A→{A};
A先進先出 →{B,C};
B先進先出 →D,E;
由於D不合法,剔除;
E入 →{C,E};
C先進先出 →F,G →{E,F,G};
E先進先出→H,I →{F,G,I};
H不合法,剔除;
F先進先出→J,K→{G,I,J,K};
G先進先出→L,M→{I,J,K,L,M};
此時已到達葉子節點,計算各合法分支的值,最優值爲50,對應的最優解爲{0,1,1}
第二種:優先隊列式分支限界法
按照優先隊列中規定的優先級選取優先級最高的結點成爲當前擴展結點。
在本例中,優先級即爲各節點的價值,當前價值高的節點優先。
隊列空 A→{A};
A → B,C→{B,C};
B的價值爲45, C的價值爲0, 則B出 →D,E;
由於D不合法,剔除;
E入 →{C,E};
E的價值大於C的價值,則 E出 →F,G →{C,F,G};
由於F不合法,剔除;
此時, G爲葉子節點,則只能C出→H,I →{H,I};
H的價值爲25, I爲0,則H出→J,K →{I,J,K};
J,K均爲葉子節點,則只能I出→L,M→{L,M};
此時各分支均已到達葉子節點,計算各合法分支的值,則最優值爲50,最優解爲{0,1,1}。
兩種方法生成節點的順序不同,最優解完全一樣。