回溯法求装载问题

package mouse;

import java.text.DecimalFormat;
import java.text.NumberFormat;

public class Loading {
	static int n;// 集装箱数目
	static double[] w;// 集装箱重量数组
	static double c;// 第一艘轮船的载重量
	static double cw;// 当前载重量
	static double bestw;// 当前最优载重量
	static double r;// 剩余集装箱重量
	static int[] x;// 当前解,记录从根至当前节点的路径
	static int[] bestx;// 记录当前最优解

	public static double maxLoading(double[] ww, double cc) {
		// 初始化类数据成员,数组下标从1开始
		n = ww.length - 1;
		w = ww;
		c = cc;
		cw = 0;
		bestw = 0;
		x = new int[n + 1];
		bestx = new int[n + 1];

		// 初始化r,即剩余最大重量
		for (int i = 1; i <= n; i++) {
			r += w[i];
		}
		// 计算最优载重量
		backtrack(1);
		return bestw;
	}

	// 回溯算法
	public static void 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];
		r=changeDouble(r);
		if (cw + w[i] <= c) {// 搜索左子树(约束函数)
			x[i] = 1;// 左子树标志为1
			cw += w[i];
			backtrack(i + 1);// 搜索下一层
			cw -= w[i];// 恢复现场,因为cw是全局变量
		}
		if (cw + r > bestw) {// 搜索右子树(限界函数)
			x[i] = 0;// 右子树标志为0
			backtrack(i + 1);
		}
		r += w[i];// 恢复现场,r是全局变量
	}
	
	//double 类型保留一位小数
    public static double changeDouble(Double dou){
        NumberFormat   nf=new  DecimalFormat( "0.0 ");
        dou = Double.parseDouble(nf.format(dou));
        return dou;
    }

	public static void main(String[] args) {
		double [] w = { 0, 4.1,5.2,6.3,7.4,8.5,9.6,10.7,11.8,12.9,3.2};
		double c1 = 40.0;
		double c2 = 50.0;
		int n = w.length - 1;
		double weight1 = maxLoading(w, c1);
		double weight2 = 0;// 保存第2艘船可能要装的重量
		for (int i = 1; i <= n; i++)
			weight2 += w[i] * (1 - bestx[i]);// 剩余未装入的集装箱全部装入第二艘船,bestx[i]为1或者0
		if (weight2 > c2)
			System.out.println("无法将全部集装箱装入两艘船。");
		else {
			System.out.println("第一艘船装入的重量是:" +changeDouble(weight1));
			System.out.println("第二艘船装入的重量是:" + weight2);
			for (int i = 1; i <= n; i++) {
				if (bestx[i] == 1)
					System.out.println("集装箱" + i + "装入第一艘船;");
				else
					System.out.println("集装箱" + i + "装入第二艘船;");
			}
		}
	}
}

《回溯法求装载问题》

    原文作者:回溯法
    原文地址: https://blog.csdn.net/u010343650/article/details/53244268
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞