`
cm14k
  • 浏览: 31898 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

装载问题

阅读更多

装载问题
有一批共n个集装箱要装上两艘载重量分别为c1和c2的轮船,集装箱总重量小于等于c1+c2,要求定一个合理的装载方案可将这n个集装箱装上这两艘轮船。

可以证明,如果一个给定装载问题有解,则采用下面的策略可得到最优的装载方案:

1)首先将第一艘轮船尽可能装满

2)将剩余的集装箱装上第二艘轮船

 

将第一艘轮船尽可能装满等价于选取全体集装箱的一个子集,使该子集中集装箱重量之和接近第一艘轮船载重量c1.

该问题类似于0-1背包问题,可以用动态规划法解决。

 

用回溯法解装载问题时,用子集树表示其解空间显然是最合适的。

 

回溯法实现:

/*
 * 装载问题
 * 有一批共n个集装箱要装上两艘载重量分别为c1和c2的轮船
 * 要求确定一个合理的装载方案可将这n个集装箱装上这两艘轮船。
 * 
 * 解决策略:
 * 1)首先将第一艘轮船尽可能装满
 * 2)将剩余的集装箱装上第二艘轮船
 * 将第一艘轮船尽可能装满等价于选取全体集装箱的一个子集,使该子集中集装箱重量之和接近轮船载重量。
 * 类似于0-1背包问题 可以使用动态规划解决
 * 
 * 回溯法解决:
 * 用子集树表示解空间
 *
 * 
 * date:2010/12/12
 * auther: cm
 */
public class LoadProblem 
{
	private int n;			//集装箱数量
	private double[] w;		//集装箱重量数组
	private double c;		//第一艘轮船的载重量
	private double cw;		//当前载重量
	private double bestw;	//最优载重量

	//用于剪去不含最优解的子树
	private double rw;		//剩余集装箱重量

	//用于构造最优解
	private int[] x;		//当前解
	private int[] bestx;	//当前最优解


	public LoadProblem(double[] w, double c)
	{
		this.w = w;
		this.c = c;
		n = w.length;
		x = new int[n];
		bestx = new int[n];

		for (int i = 0; i < n; i++)
		{
			rw += w[i];
		}
	}

	//计算最优载重量
	public double maxLoading()
	{
		backtrack(0);
		return bestw;
	}

	//回溯算法
	private void backtrack(int i)
	{
		//搜索第i层节点
		if (i >= n)	//到达页节点
		{
			//System.out.println("达到叶节点.............");
			if (cw > bestw)
			{
				//System.out.println("更新bestw...........");
				bestw = cw;
				for (int j = 0; j < x.length; j++)
				{
					bestx[j] = x[j];
				}
			}
			return;
		}

		//搜索子树
		if (cw + w[i] <= c)
		{
			x[i] = 1;
			cw += w[i];
			backtrack(i + 1);
			cw -= w[i];
		}
		

		rw -= w[i];
		//搜索右子树
		if (cw + rw > bestw)	//剪去不含最优解的子树
		{
			x[i] = 0;
			backtrack(i + 1);
		}
		rw += w[i];
	}

	public int[] getBestx()
	{
		return bestx;
	}


	public static void main(String[] args) 
	{
		double[] w = {40, 40, 10};
		double c1 = 50;
		LoadProblem load = new LoadProblem(w, c1);
		System.out.println(load.maxLoading());
		int[] x = load.getBestx();
		for (int i = 0; i < x.length; i++)
		{
			System.out.print(x[i] + " ");
		}
	}
}
 

 

 

分享到:
评论

相关推荐

    最优装载问题 c++

    最优装载问题,也被称为集装箱装载或货车装载问题,是一个经典的组合优化问题,广泛应用于物流、运输和资源分配等领域。在该问题中,我们需要在有限的空间内最大化装载物品的数量,同时确保不超出容器的容量限制。这...

    装载问题-分支限界算法-java实现

    装载问题-分支限界算法-java实现 装载问题 装载问题是一种经典的组合优化问题,目的是在有限的容量内装载尽可能多的物品,以达到最大化总重量或总价值。装载问题有多种变种,包括0/1背包问题、分支限界问题、动态...

    分支限界法解决装载问题

    装载问题是一种经典的优化问题,通常出现在物流、运输和资源分配等领域。它的目标是在满足特定条件的情况下,最大化或最小化某个量。在这个问题中,我们通常有一组物品,每种物品有重量和价值,以及一个有限的承载体...

    装载问题.回溯法

    标题中的“装载问题.回溯法”指的是一个经典的计算机算法问题,它涉及到如何有效地在有限的资源条件下,如一艘船的载重限制,装载物品以最大化装载量或价值。在这个问题中,通常需要找到一种最优的装载组合,使得...

    装载问题回溯算法

    装载问题,也称为装箱问题或背包问题,是运筹学和计算机科学中常见的优化问题。它涉及到在有限的资源约束下,如何有效地分配物品或任务以达到最大的效益。在这个问题中,我们要解决的是如何将不同重量的货物装入有限...

    装载问题(回溯法)报告.doc

    【装载问题(回溯法)】是算法设计与分析领域中的一个重要问题,主要涉及如何高效地安排多个集装箱的装载,以充分利用两艘轮船的载重能力。此问题可以通过回溯法来解决,这是一种试探性的搜索策略,适用于解决约束...

    装载问题的算法

    标题:装载问题的算法 描述:此段代码展示了一个典型的装载问题解决方法,采用的是回溯法(backtracking)而非描述中的贪心算法。装载问题(也称为背包问题)是计算机科学与运筹学中一个经典的问题,主要研究如何在...

    哈夫曼编码 回溯法 0-1背包问题 装载问题 VC

    实验中指出,回溯法解决的装载问题与贪心法解决的装载问题有区别,主要是贪心法通常在每一步选择最大价值或体积的物品,而回溯法则会尝试所有可能的物品组合,以找到全局最优解。 VC,即Visual C++,是Microsoft...

    最优装载问题——回溯法

    最优装载问题——回溯法 最优装载问题——回溯法 最优装载问题——回溯法

    最优装载问题(贪心算法)c++

    ### 最优装载问题(贪心算法)c++ #### 问题背景与定义 最优装载问题是在计算机科学和运筹学中的一个经典问题。该问题描述了一种情况:假设有一艘轮船,其最大载重量为\( c \)吨,现在有一批集装箱需要装载到这艘...

    回溯法实验报告解装载问题

    在这个实验报告中,回溯法被应用于解决装载问题,具体是经典的N皇后问题,即在N×N的棋盘上放置N个皇后,使得每行、每列以及对角线上的皇后互不攻击。该问题的解决方案需要满足两个主要条件:同一行、同一列以及两条...

    C++最优装载问题

    【标题】:“C++最优装载问题” 在计算机科学和编程领域,最优装载问题是一个经典的运筹学问题,它涉及到如何高效地安排有限空间内的物品装载,以达到最大的效益。在这个问题中,我们通常考虑一系列具有不同重量和...

    回溯法 背包问题和装载问题

    回溯法是一种强大的算法策略,常用于解决组合优化问题,如经典的背包问题和装载问题。在这些问题中,我们通常需要在有限的资源约束下,选择最优的子集以达到最大的效益或最小的成本。下面我们将深入探讨这两个问题...

    贪心算法-背包装载问题

    贪心算法-背包装载问题 贪心算法是指在解决问题时,总是做出在当前看来是最好的选择,而不考虑长远的结果。贪心算法可以应用于解决许多问题,例如背包装载问题、活动选择问题、Huffman编码等。 背包装载问题是指:...

    求解装载问题.rar

    装载问题,又称装箱问题或装载优化问题,是运筹学和计算机科学中的一种经典问题。在实际应用中,它通常出现在物流、生产计划、资源分配等领域,涉及到如何将有限数量和大小的物品有效地装入有限空间的容器中,以达到...

    数据结构箱子装载问题

    在本项目中,我们关注的是一个具体的数据结构应用——"数据结构箱子装载问题",这是一个0/1背包问题的扩展,涉及到了优化算法和决策制定。 0/1背包问题是一个经典的组合优化问题,它源自于物流、运输和资源分配等...

    背包最优装载问题

    ### 背包最优装载问题 #### 一、问题背景及定义 背包最优装载问题(Knapsack Problem)是组合优化中的一个经典问题,在实际应用中有广泛的用途,比如物流配送、资源分配等领域。该问题的基本形式是:给定一系列...

    3-4最优装载问题

    最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。 Input 输入的第一个为测试样例的个数T( T ),接下来有T个测试样例。每个测试样例的第一行是一个整数n( n )和一个非负数C( C )...

    回溯算法装载问题.doc

    回溯算法在装载问题中的应用 回溯算法是一种常用的搜索算法,适用于解决组合优化问题。在实验六中,我们将学习如何使用回溯算法解决装载问题。 一、实验目的与要求 1. 掌握装载问题的回溯算法; 2. 初步掌握回溯...

    托盘装载问题

    "托盘装载问题" 在物流供应链中,托盘装载问题是一个非常重要的研究课题。随着我国经济的发展,物流需求日益增长,传统的托盘存储方式已经不能满足现代物流的需求。托盘已经成为衡量一个国家物流效率水平的重要标志...

Global site tag (gtag.js) - Google Analytics