您的位置:首页 > 其它

回溯法解决装载问题

2011-12-04 20:22 363 查看


/********************************************************************
*    MAIN.CPP    文件注释
*    文件路径:    D:\EVERBOX\SOURCE CODE\贪心法\装载问题/
*    作者    :    杨帆 江南大学 计科0905
*    创建时间:    2011/12/4 20:24
*    文件描述:
*********************************************************************/
#include <iostream>
using namespace std;

typedef int* pINT;
template<class Type>
class Loading{
public:
friend Type MaxLoading(Type* w,int num ,Type C1,int* bestx );
friend void SolveLoading(int C2,bool* x,int* w,int num);

void Backtrack(int i);

int num;/* 集装箱数目 */
int * x;/* 当前解 */
int * bestx;/* 当前最优解 */

Type* w;/* 集装箱重量数组 */
Type  C1;/* 第一艘船的容量 */
Type cw;
Type bestw;
Type r;/* 剩余集装箱重量 */
};

template<class Type>
void Loading<Type>::Backtrack( int i )
{
if( i > num){
if ( cw > bestw ) {
for (int i = 1; i <= num ; i++ ) {
bestx[i] = x[i];
bestw = cw;
}
}
return ;
}
r -= w[i];
if ( cw+w[i] <= C1 ) {
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,int num ,Type C1,int* bestx )
{
Loading<Type> X;
X.x = new int[num+1];
X.w = w;
X.C1= C1;
X.num = num;
X.bestx = bestx;
X.bestw = 0;
X.cw = 0;
X.r = 0;
for (int i = 1; i <= num ; i++ ) {
X.r += w[i];
}
X.Backtrack(1);
delete[] X.x;
return X.bestw;

}
template<class Type>
void    SolveLoading( int C2,int* x,Type* w,int num )
{
int totalW = 0;
int c1W = 0;/* 第一艘船总载重 */
for (int i = 1; i <= num ; i++ ) {
if ( x[i] == 1 ) {
c1W += w[i];
}
totalW += w[i];
}
if ( totalW-c1W > C2 ) {
printf("没有合理的装载方案! :( ");
return;
}

printf(" 装载方案如下:\n ");
printf(" 第一艘船装 ");
for (int i = 1; i <= num ; i++ ) {
if ( x[i] == 1 ) {
printf("%d ",i);
}
}
printf("\n总载重 %d \n",c1W);

printf(" 第二艘船装 ");
for (int i = 1; i <= num ; i++ ) {
if ( ! x[i] ) {
printf("%d ",i);
}
}
printf("\n总载重 %d \n",totalW-c1W);

}

int main(int argc,char* argv[]){

int C1 = 0;
int C2 = 0;
int num = 0;
int* x = NULL;
int** m = NULL;
int* w = NULL;

printf("输入第一艘船最大载重量:");
scanf("%d",&C1);

printf("输入第二艘船最大载重量:");
scanf("%d",&C2);

printf("输入货物个数");
scanf("%d",&num);

x = new int[num+1];
w = new int[num+1];
m = new pINT[num+1];
for (int i = 0; i < num+1 ; i++ ) {
m[i] = new int[num+1];
}

printf("分别输入货物重量(回车结束):\n");

for (int i = 1; i <= num ; i++ ) {
scanf("%d",w+i);
}

MaxLoading(  w, num, C1, x );

SolveLoading(C2, x, w, num);

delete[] x;
delete[] w;
delete[] m;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: