贪婪算法---货箱装船

2016-02-19 15:54 26 1 收藏

图老师设计创意栏目是一个分享最好最实用的教程的社区,我们拥有最用心的各种教程,今天就给大家分享贪婪算法---货箱装船的教程,热爱PS的朋友们快点看过来吧!

【 tulaoshi.com - 编程语言 】


  这个问题来自例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, ik。寻找[ 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 p>// 初始化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; }

来源:http://www.tulaoshi.com/n/20160219/1610666.html

延伸阅读
专家:有些胎儿该舍就舍 妊娠和分娩本来是件让人高兴的事,但是有时候会面对无法逃避的取舍问题。随着社会的进步,患者对医生提出了更高的要求:既要保大人,又要保孩子!然而医生不是万能的,即使再努力,有些事情也左右不了,有些孩子需要被放弃。 医学还不能满足患者需要 上海交通大学医学院附属第一人民医院产科主任徐先明教授对《生...
//******************************************************************* //在许多情况下我们需要穷举组合的算法,比如密码词典。 //这个算法的要害是密码下标进位的问题。 //另外本例子中的写文件语句效率比较低,为了降低算法复杂度没有优化。 //假如要提高写文件的效率,可以使用缓冲区,分批写入。 //******...
写个过河算法 作者:陈健 下载源代码 警察小偷爸爸妈妈儿子女儿过河,这个游戏不用说的吧,应该很多人见过,一般是考察隔壁邻居家小朋友智商的,有人把他做成了FLASH游戏。规则如游戏图。详细请看文件中那个FLASH游戏 : 那天看见MM在玩,一不小心...
遗传算法(Genetic Algorithm, GA)是近几年发展起来的一种崭新的全局优化算法,它借用了生物遗传学的观点,通过自然选择、遗传、变异等作用机制,实现各个个体的适应性的提高。这一点体现了自然界中"物竞天择、适者生存"的进化过程。 1962年Holland教授首次提出了GA算法的思想,从而吸引了大批的研究者,迅速推广到优化、搜索、机...
功能要求如下: 排序算法比较: shellsort, quicksort, heapsort, mergesort 的算法实现 , 对同样数据集的排序时间比较。 源代码: # include stdio.h # include time.h # define MAXSIZE 2000 typedef struct{ int key[MAXSIZE]; int length; }list; long int compCount; long int shiftCount; void menu(...

经验教程

330

收藏

19

精华推荐

VB图像处理之铅笔画算法和木雕算法

VB图像处理之铅笔画算法和木雕算法

非常时尚小裤衩

中国农历算法(delphi)

中国农历算法(delphi)

搜索店名锦玉堂

分而治之算法---残缺棋盘

分而治之算法---残缺棋盘

小打小闹也是福

微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部