1. 程式人生 > 其它 >演算法第五章

演算法第五章

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:

  1. 用 for 迴圈對某個部件從 m 個不同的供應商進行選擇
  2. curwe<=minwe——上界函式,若不滿足,表示當前狀態的重量已超最小重量,不是最優解,剪去相應子樹,返回到 t-1 層繼續執行。
  3. curmon<=d——約束函式,若不滿足,表示當前狀態的金額已超約束重量,是不可行解,剪去相應子樹,返回到 t-1 層繼續執行。
  4. 若 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個元素滿足某種性質的排列時,相應的解空間樹被稱為排列樹。