バックトラッキングアルゴリズム3-ボクシングの問題

2隻の船に積み込まれるコンテナはn個あり、各船の容量はcl、c2、i番目のコンテナの重量はw [i]であり、同時に:w [] + w [2)+ 。+ w [n] <= c1 + c2;これら2隻の船にこれらのコンテナを積み込むための最適な計画を決定します。
【分析】
最良の計画の方法:最初に最初の船をできるだけいっぱいに満たしてから、残りを2番目の船に積み込みます。最初の船は可能な限り満たされます。これは、n個のコンテナからサブセットを選択することと同じです。そのため、サブセットの問題解決スペース:(x1、x2、x3、。xn)、ここでxiは0であり、最初の船、1は最初の船を意味します;
制約:
(1)実行可能制約:w1xx1 + w2x2 ... ixi。+ .. + wn * xn <= c1。
(2)最適解の制約:remain + cw> bestw(remainは残りのコンテナの重量を表し、cwは現在ロードされているコンテナの重量を表し、bestwは現在の最適なロード容量を表します)。
たとえば、コンテナの数が4、重量がそれぞれ10、20、35、40で、最初の船の最大積載量が50の場合、最適な積載は重量が10と40のコンテナを積載することです。まず、最初のコンテナから始めて、重量が10のコンテナを最初の船に積み込み、次に重量が20のコンテナを積み込みます。このとき、10 + 20 <-50で、次に次のコンテナを積み込みます。重量35しかし10+ 20 + 35> 50なので、35にロードできません。次に、重量40のコンテナをロードしてみてください。10+20 + 40> 50なので、ロードできません。どちらか。したがって、30が現在の最適な負荷容量になります。重量が20のコンテナを取り出します(戻って問題の解決策を再調整します)。重量が35のコンテナを最初の船に積み込むと、10 + 35 <50なので、積み込むことができます。45> bestwであるため、45が現在の最適負荷として採用されます。

引き続き、重量35のコンテナを取り出します。重量40のコンテナを最初の船に積み込むと、10 +40≤50であるため、最初の船に積み込まれます。50> bestwであるため、50が現在の最適負荷です。

コード:

#include<stdio.h>
#include<malloc.h>
#include <iostream>
int *w;		/*存放每个集装箱的重量*/
int n;		/*集装箱的数目*/
int c;		/*第一艘船的承载量*/
int cw = 0;	/*当前载重量*/
int remain;	/*剩余载重量*/
int	*x;		/*存放搜索时每个集装箱是否选取*/
int bestw;	/*存放最优的放在第一艘船的重量*/
int	*bestx;	/*存放最优的集装箱选取方案*/
void Backtrace(int k)
{
	int i;
	if (k > n)	 /*递归的出口,如果找到一个解*/
	{
		for (i = 1; i <= n; i++)	/*则将装入的方法存入bestx中*/
			bestx[i] = x[i];
		bestw = cw;			/*记下当前的最优装载量*/
		return;
	}
	else
	{
		remain -= w[k];
		if (cw + w[k] <= c) /*如果装入w[k],还小于c*/
		{
			x[k] = 1;		/*则装入w[k]*/
			cw += w[k];
			Backtrace(k + 1);
			cw -= w[k];	/*不装入w[k]*/
		}
		if (remain + cw > bestw)	/*如果剩余的集装箱不能完全装入*/
		{
			x[k] = 0;
			Backtrace(k + 1);		/*继续从剩余的集装箱中检查是否能装入*/
		}
		remain += w[k];		/*w[k]重新成为待装入的集装箱*/
	}
}
int BestSoution(int *w, int n, int c)
/*搜索最优的装载方案:w存放每个集装箱的重量,
n表示集装箱数目,c表示第一艘船的装载量*/
{
	int i;
	remain = 0;/*第一艘船剩下的装载量*/
	for (i = 1; i <= n; i++)
	{
		remain += w[i];
	}
	bestw = 0;/*初始化第一艘船最优装载量*/
	Backtrace(1);
	return bestw;
}
void main()
{
	int i;
	printf("请输入集装箱的数目=");
	scanf("%d", &n);
	w = (int*)malloc(sizeof(int)*(n + 1));
	x = (int*)malloc(sizeof(int)*(n + 1));
	bestx = (int*)malloc(sizeof(int)*(n + 1));
	printf("请输入第一艘船的装载量=");
	scanf("%d", &c);
	printf("请输入每个集装箱的重量:\n");
	for (i = 1; i <= n; i++)
	{
		printf("第%d的重量=", i);
		scanf("%d", &w[i]);
	}
	bestw = BestSoution(w, n, c);
	for (i = 1; i <= n; i++)
	{
		printf("%4d", bestx[i]);
	}
	printf("\n");
	printf("存放在第一艘船上的重量:%d\n", bestw);
	free(w);
	free(x);
	free(bestx);
	system("pause");
}

結果:


 

おすすめ

転載: blog.csdn.net/baidu_36669549/article/details/104157017