1.3.1 货箱装船

原创 2004年10月11日 13:59:00

 

这个问题来自例1 - 2。船可以分步装载,每步装一个货箱,且需要考虑装载哪一个货箱。根据这种思想可利用如下贪婪准则:从剩下的货箱中,选择重量最小的货箱。这种选择次序可以保证所选的货箱总重量最小,从而可以装载更多的货箱。根据这种贪婪策略,首先选择最轻的货箱,然后选次轻的货箱,如此下去直到所有货箱均装上船或船上不能再容纳其他任何一个货箱。

例1-7 假设n =8, [w1 , ... w8 ]=[100,200,50,90,150,50,20,80], c= 4 0 0。利用贪婪算法时,所考察货箱的顺序为7 , 3 , 6 , 8 , 4 , 1 , 5 , 2。货箱7 , 3 , 6 , 8 , 4 , 1的总重量为3 9 0个单位且已被装载,剩下的装载能力为1 0个单位,小于剩下的任何一个货箱。在这种贪婪解决算法中得到[x1 , ..., x8 ] = [ 1 , 0 , 1 , 1 , 0 , 1 , 1 , 1 ]且?xi = 6。

定理1-1 利用贪婪算法能产生最佳装载。

证明可以采用如下方式来证明贪婪算法的最优性:令x = [x1 , ..., xn ]为用贪婪算法获得的解,令y =[ y1 , ..., yn ]为任意一个可行解,只需证明n ?i= 1xi ≥n ?i= 1yi 。不失一般性,可以假设货箱都排好了序:即wi≤wi + 1(1≤i≤n)。然后分几步将y 转化为x,转换过程中每一步都产生一个可行的新y,且n ?i = 1yi 大于等于未转化前的值,最后便可证明n ?i = 1xi ≥n ?j = 1yi 。

根据贪婪算法的工作过程,可知在[0, n] 的范围内有一个k,使得xi =1, i≤k且xi =0, i>k。寻找[ 1 ,n]范围内最小的整数j,使得xj≠yj 。若没有这样的j 存在,则n ?i= 1xi =n ?i = 1yi 。如果有这样的j 存在,则j≤k,否则y 就不是一个可行解,因为xj≠yj ,xj = 1且yj = 0。令yj = 1,若结果得到的y 不是可行解,则在[ j+ 1 ,n]范围内必有一个l 使得yl = 1。令yl = 0,由于wj≤wl ,则得到的y 是可行的。而且,得到的新y 至少与原来的y 具有相同数目的1。

经过数次这种转化,可将y 转化为x。由于每次转化产生的新y 至少与前一个y 具有相同数目的1,因此x 至少与初始的y 具有相同的数目1。货箱装载算法的C + +代码实现见程序1 3 - 1。由于贪婪算法按货箱重量递增的顺序装载,程序1 3 - 1首先利用间接寻址排序函数I n d i r e c t S o r t对货箱重量进行排序(见3 . 5节间接寻址的定义),随后货箱便可按重量递增的顺序装载。由于间接寻址排序所需的时间为O (nl o gn)(也可利用9 . 5 . 1节的堆排序及第2章的归并排序),算法其余部分所需时间为O (n),因此程序1 3 - 1的总的复杂性为O (nl o gn)。

程序13-1 货箱装船

template

void ContainerLoading(int x[], T w[], T c, int n)

{// 货箱装船问题的贪婪算法

// x[i] = 1 当且仅当货箱i被装载, 1<=i<=n

// c是船的容量, w 是货箱的重量

// 对重量按间接寻址方式排序

// t 是间接寻址表

int *t = new int [n+1];

I n d i r e c t S o r t ( w, t, n);

// 此时, w[t[i]] <= w[t[i+1]], 1<=i

// 初始化x

for (int i = 1; i <= n; i++)

x[i] = 0;

// 按重量次序选择物品

for (i = 1; i <= n && w[t[i]] <= c; i++) {

x[t[i]] = 1;

c -= w[t[i]];} // 剩余容量

delete [] t;

}

转载自沙大工作室

贪心算法之装船问题

问题描述:吉祥号货轮最大载重量为M吨,有N件货物供选择装船,每件货物的重量和价值是不同的。设计程序使得总重量不超过M,且装的货物总价值最大。 //************************...
  • he_xiang_
  • he_xiang_
  • 2013年10月19日 11:40
  • 890

贪心算法例题:2052装船问题

Problem Description 王小二毕业后从事船运规划工作,吉祥号货轮的最大载重量为M吨,有10种货物可以装船。第i种货物有wi吨,总价值是pi。王小二的任务是从10种货物中挑选若干吨...
  • FightingEveryDay365
  • FightingEveryDay365
  • 2017年07月27日 17:47
  • 148

装船问题

装船问题 Time Limit: 1000MS Memory limit: 65536K 题目描述 王小二毕业后从事船运规划工作,吉祥号货轮的最大载重量为M吨,有10种货物可以装...
  • qq_33435265
  • qq_33435265
  • 2016年03月27日 17:06
  • 475

贪心之装船问题

Problem Description 王小二毕业后从事船运规划工作,吉祥号货轮的最大载重量为M吨,有10种货物可以装船。第i种货物有wi吨,总价值是pi。王小二的任务是从10种货物中挑选若干吨...
  • s_t_a_r_s
  • s_t_a_r_s
  • 2017年04月23日 00:29
  • 147

配置Cocoapods 新版本Xcode 7.3 pod版本1.0.1

有参考部分文档0.0 1.打开终端 2. 检查是否拥有ruby环境. 命令:ruby -v   回车 现象:ruby 2.0.0 ******** 现象,我安装时的电脑...
  • yinbingbing123456
  • yinbingbing123456
  • 2016年07月19日 10:34
  • 505

LoadingLayout封装网络请求的各种效果

继承FrameLayout,在xml渲染完成后,加上加载中、无网络、无数据、出错四个页面,根据需要控制显示哪一层,花了些时间,开了很多方法出来,支持很多属性的设置,算是比较实用,源码里已对各个方法的作...
  • baidu_29601793
  • baidu_29601793
  • 2016年12月03日 22:26
  • 738

1.3.1

/* ID:18861501 LANG:C++ TASK:milk */ /*------------------Header Files------------------*/ #include ...
  • qq_33765907
  • qq_33765907
  • 2016年03月25日 15:53
  • 85

javabase64 1.3 manual

Index RequirementsInstallationJavadocsQuickstartEncoding with Base64OutputStreamDecoding with Bas...
  • djun100
  • djun100
  • 2014年01月15日 17:17
  • 1565

myeclipse创建maven项目pom报错,Failure to transfer com.thoughtworks.xstream:xstream:jar:1.3.1

用mycelispe搭建SSM开发环境,创建项目后,POM直报错,提示xstream:xstream:jar存在问题,但是不影响运行。解决办法,在自己的.m2(C/user下)和本地applicati...
  • Huangcsdnjava
  • Huangcsdnjava
  • 2017年06月08日 23:34
  • 721

Zookeeper3.4.9、Hbase1.3.1、Pig0.16.0安装及配置(基于Hadoop2.7.3集群)

一、Hadoop集群环境安装配置详见:Hadoop完全分布式集群安装及配置(基于虚拟机) Ubuntu镜像版本: ubuntu-16.04.2-server-amd64.iso JDK版本: j...
  • quiet_girl
  • quiet_girl
  • 2017年07月12日 20:24
  • 1344
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1.3.1 货箱装船
举报原因:
原因补充:

(最多只允许输入30个字)