算法设计与分析——回溯法——装载问题
生活随笔
收集整理的這篇文章主要介紹了
算法设计与分析——回溯法——装载问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
0027算法筆記——【回溯法】回溯法與裝載問題
自己寫的代碼:
#include <iostream> using namespace std; template <class Type> class Loading {//friend Type MaxLoading(Type[],Type,int,int []);//private:public:void Backtrack(int i);int n, //集裝箱數*x, //當前解*bestx; //當前最優解Type *w, //集裝箱重量數組c, //第一艘輪船的載重量cw, //當前載重量bestw, //當前最優載重量r; //剩余集裝箱重量 };//template <class Type> //void Loading <Type>::Backtrack (int i);template<class Type> Type MaxLoading(Type w[], Type c, int n, int bestx[]);int main() { int n=10,m;int c=500,c2=121;int w[11]={ 0,21,54,21,45,20,65,320,1,20,54};int bestx[10];m=MaxLoading(w, c, n, bestx);cout<<"輪船的載重量分別為:"<<endl;cout<<"c(1)="<<c<<",c(2)="<<c2<<endl;cout<<"待裝集裝箱重量分別為:"<<endl;cout<<"w(i)=";for (int i=1;i<=n;i++){cout<<w[i]<<" ";}cout<<endl;cout<<"回溯選擇結果為:"<<endl;cout<<"m(1)="<<m<<endl;cout<<"x(i)=";for (int i=1;i<=n;i++){cout<<bestx[i]<<" ";}cout<<endl;int m2=0;for (int j=1;j<=n;j++){m2=m2+w[j]*(1-bestx[j]);}cout<<"m(2)="<<m2<<endl;if(m2>c2){cout<<"因為m(2)大于c(2),所以原問題無解!"<<endl;}return 0; }template <class Type> void Loading <Type>::Backtrack (int i)// 搜索第i層結點 {if (i > n)// 到達葉結點{ if (cw>bestw){for(int j=1;j<=n;j++) {bestx[j]=x[j];//更新最優解bestw=cw; }} return;}r-=w[i]; if (cw + w[i] <= c) // 搜索左子樹{ x[i] = 1;cw += w[i];Backtrack(i+1);cw-=w[i]; }if (cw + r > bestw){x[i] = 0; // 搜索右子樹Backtrack(i + 1); }r+=w[i]; }template<class Type> Type MaxLoading(Type w[], Type c, int n, int bestx[])//返回最優載重量 {Loading<Type>X;//初始化XX.x=new int[n+1];X.w=w;X.c=c;X.n=n;X.bestx=bestx;X.bestw=0;X.cw=0;//初始化rX.r=0;for (int i=1;i<=n;i++){X.r+=w[i];}X.Backtrack(1);delete []X.x;return X.bestw; }
第二程序:
第三程序:
第四程序:
輸出帶有序列
總結
以上是生活随笔為你收集整理的算法设计与分析——回溯法——装载问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哪吒汽车后视镜防眩目专利公布:驾驶员眯眼
- 下一篇: 算法设计与分析——回溯法——n皇后问题