《优装载问题》PPT课件_第1页
《优装载问题》PPT课件_第2页
《优装载问题》PPT课件_第3页
《优装载问题》PPT课件_第4页
《优装载问题》PPT课件_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、最优装载问题姓名:谭立威学号:0301307371精选ppt简介问题描述实现原理贪心性质代码实现致谢2精选ppt问题描述有一批集装箱要装上一艘载重量为 c的轮船。第 i个集装箱的重量为 Wi。 最优装载问题要求在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。3精选ppt问题描述问题可形式化描述为:设:xi表示第i个集装箱是否装载, xi = 0 or 1, i = 1 to n; 求:Max(x1+x2+xn)约束条件:W1*x1 + W2*x2 + + Wn*xn = c4精选ppt实现原理每次选择时,从剩下的集装箱中,选择重量最小的集装箱。通过这样的选择可以保证已经选出来的集装箱总

2、重量最小,装载的集装箱数量最多,直到船只不能再继续装载为止。5精选ppt证明考虑任意装载容量为K的非空子问题Sk,令am是Sk中重量最小的集装箱,则am在Sk的某个集装箱装载数量最多且总重量最少的最优子集中。证明:令Ak是Sk的一个最优子集,且aj是Ak中重量最小的集装箱。若aj=am,则证明am在Sk的某个最优子集中。若ajam,则将Ak中的aj替换为am得到Ak,amweight (struct box*)b)-weight) return 1; else return 0;/按集装箱重量对集装箱进行快速排序 qsort(boxes,8,sizeof(struct box),cmp);时间

3、复杂度为O(n2)11精选ppt代码实现/累加重量 计算可装载集装箱数量maxLoad = 500;countLoad = 0;quantity = 0;for(i=0;i8;i+) /如果还能继续装载 if(boxesi.weight = maxLoad - countLoad) countLoad = countLoad + boxesi.weight; /计算最大装载数量quantity quantity +; /获取装载标记 flagboxesi.index = 1;时间复杂度O(n)12精选ppt代码实现编号为6,2,5,7,3,0的集装箱总重量为390单位且已被装载,剩余的装载容量

4、为10个单位,小于剩余任一集装箱的重量。问题结束。在这个贪心解决算法中通过flag数组中的结果可以得到 x0,x1,x7=1,0,1,1,0,1,1,1,且xi = 6, i = 0 to 7总的时间复杂度为O(n2)+c*O(n),即O(n2) (W0,W2,W7 = 100,200,50,90,150,50,20,80, 船只载重c=400)13精选ppt代码实现截图14精选ppt致谢感谢刘东林老师给予这次讲课机会感谢邵舒迪同志的帮助Thanks for your attentions参考:算法导论第三版 十六章 定理16.1;互联网:/p-422844096.html ;15精选ppt代

5、码实现完整代码#include #include / 集装箱 结构体 typedef struct box int weight;/重量 int index; /初始序号 ;/比较子函数 int cmp (const void *a, const void *b) if(struct box*)a)-weight (struct box*)b)-weight) return 1; else return 0;int main() /初始化集装箱集合 struct box boxes8 = 100,0,200,0,50,0,90,0,150,0,50,0,20,0,80,0 ; int flag

6、8 = 0;/集装箱装载标志 int i ; int quantity; /可装载集装箱数量 int maxLoad; /船只最大载重 int countLoad;/已经装载重量 /输出集装箱初始数据 printf(集装箱初始数据); printf(n); for(i=0;i8;i+) printf(b%d:%d t,i,boxesi.weight); printf(n); /初始化 集装箱序号 for(i=0;i8;i+) boxesi.index = i; printf(n); printf(快速排序之后:); printf(n); /按集装箱重量对集装箱进行快速排序 qsort(boxe

7、s,8,sizeof(struct box),cmp); /从小到达输出集装箱重量 for(i=0;i8;i+) printf(b%d:%d t,i,boxesi.weight); printf(n); printf(n); printf(集装箱初始时的下标 :); printf(n); /输出集装箱初始时的下标 for(i=0;i8;i+) printf(index%d:%d t,i,boxesi.index); printf(n); /累加重量 计算可装载集装箱数量 maxLoad = 500; countLoad = 0; quantity = 0; for(i=0;i8;i+) /如果还能继续装载 if(boxesi.weight = maxLoad - countLoad) countLoad = countLoad + boxesi.weight; /计算最大装载数量quantity quantity +; /获取装载标记 flagboxesi.index = 1; printf(n); printf(集装箱最大装载数:); printf(n); printf(quantity:%d,quantity); printf(n); printf(n);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论