演算法第五章
阿新 • • 發佈:2021-12-16
1.問題描述
2.請用回溯法的方法分析“最小重量機器設計問題”
if(t>n)//到達根結點 { if(minwe>curwe) { minwe=curwe; for(int i=1;i<=n;i++) { re[i]=x[i]; } } return; } for(int i=1;i<=m;i++) { x[t]=i; curmon += c[t][i]; curwe += w[t][i]; if(curmon<=d&&curwe<=minwe)//剪枝函式 { backtrack(t+1); } curmon-= c[t][i]; curwe-= w[t][i]; }
解題思路:
輸入:部件有 n 個,供應商有 m 個,d 為總價格的上限。二維陣列 w[i][j] 儲存從供應商 j 處購得的部件 i 的重量,二維陣列c[i][j] 儲存從供應商 j 處購得的部件 i 的價格。
主函式遞迴backtrack函式,backtrack(1) 從第一個貨物開始選擇供應商
backtrack:
- 用 for 迴圈對某個部件從 m 個不同的供應商進行選擇
- curwe<=minwe——上界函式,若不滿足,表示當前狀態的重量已超最小重量,不是最優解,剪去相應子樹,返回到 t-1 層繼續執行。
- curmon<=d——約束函式,若不滿足,表示當前狀態的金額已超約束重量,是不可行解,剪去相應子樹,返回到 t-1 層繼續執行。
- 若 t > n ,表示搜尋到一個葉結點,若minwe>curwe,記錄當前minwe,並用 re[i] 對每個部件的供應商進行記錄.
輸出:最小總重量minwe,每個部件選擇的供應商re[i]。
2.1 說明“最小重量機器設計問題"的解空間
以輸入樣例為例,其解空間為:
(1,1,1)(1,1,2)(1,1,3)
(1,2,1)(1,2,2)(1,2,3)
(1,3,1)(1,3,2)(1,3,3)
(2,1,1)(2,1,2)(2,1,3)
(2,2,1)(2,2,2)(2,2,3)
(2,3,1)(2,3,2)(2,3,3)
(3,1,1)(3,1,2)(3,1,3)
(3,2,1)(3,2,2)(3,2,3)
(3,3,1)(3,3,2)(3,3,3)
【(X,Y,Z):x代表第1個部件選擇第x個供應商,y代表第2個部件選擇第y個供應商,z代表第3個部件選擇第z個供應商。】
2.2 說明 “最小重量機器設計問題"的解空間樹
2.3 在遍歷解空間樹的過程中,每個結點的狀態值是什麼
每個結點的狀態值是選擇到當前狀態時的重量w和價格c
3. 你對回溯演算法的理解
回溯法:
按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法。
回溯演算法解決問題:旅行售貨員、n皇后問題、0-1揹包問題。
剪枝函式:
- 用約束函式在擴充套件結點處剪去不滿足約束的子樹
- 用上界函式剪去得不到最優解的子樹
子集樹:
當所給問題是從n個元素的集合S中找出滿足某種性質的子集時(選或不選某個結點),相應的解空間樹被稱為子集樹。
排列樹:
當所給問題是確定n個元素滿足某種性質的排列時,相應的解空間樹被稱為排列樹。