回溯法 | 子集樹:裝載問題


學習鏈接:回溯法:最優裝載問題回溯法最優裝載問題(java)


 

輸入:

int[]w={21,10,5};
        Load_Cargo problem=new Load_Cargo(w,34);

輸出:

最大裝載量:31
應裝入的貨物:1 2 

java代碼:

 1 class Load_Cargo{//裝載問題
 2     int[] w;//各貨物的重量
 3     int wMax;//最大載重量
 4     int nowWei=0;//當前載重量
 5     int bestWei=0;//最優重量    
 6     
 7     int restCargo=0;//剩余貨物重量
 8     int cargo_len=0;//貨物數目
 9     
10     int []x;//當前解向量    
11     int []bestX;//最優解
12 
13     Load_Cargo(int[] w,int wMax){
14         this.w=w;
15         this.wMax=wMax;
16         cargo_len=w.length;
17         x=new int[cargo_len];
18         bestX=new int[cargo_len];
19         int i;
20         for(i=0;i<cargo_len;i++){
21             restCargo+=w[i];
22         }
23     }
24     void solve(){
25         BackTrace(0);
26         System.out.println("最大裝載量:"+bestWei);
27         System.out.print("應裝入的貨物:");
28         for(int i=0;i<cargo_len;i++){
29             if(bestX[i]==1){
30                 System.out.print((i+1)+" ");
31             }
32         }
33         System.out.println();
34     }
35     void BackTrace(int t){
36         if(t<cargo_len){//如果沒有抵達葉子節點
37             restCargo-=w[t];//剩余貨物 減去 當前貨物重量
38             //遍歷左子樹
39             if(nowWei+w[t]<=wMax){//如果當前貨物能放入
40                 nowWei+=w[t];
41                 x[t]=1;
42                 BackTrace(t+1);
43                 nowWei-=w[t];
44             }
45             //遍歷右子樹
46             if(nowWei+restCargo>bestWei){//如果當前重量 加上 剩余貨物 比最優解重
47                 x[t]=0;
48                 BackTrace(t+1);
49             }
50             restCargo+=w[t];//恢復 剩余貨物重量
51         }else{//葉子節點,回溯完畢
52             int a;
53             a=0;
54             if(nowWei>bestWei){//當前重量大於剩余重量
55                 //更新最優解向量
56                 bestX=x.clone();
57                 bestWei=nowWei;
58             }
59         }
60     }
61     
62 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM