- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
试验三贪心算法的应用
实验三:贪心算法的应用
吴博
实验描述
集装箱的装箱问题
给定一个集装箱,其长为L,宽为W和高为H,现有一批圆柱形木材,每根木材的长均为L,但是半径不同,设第i根木材半径为ri。问如何装箱,使得集装箱的空间利用率最高?
程序设计
任给一个输入实例,能输出集装箱的空间利用率
能用图形演示装箱的过程
实验思路.
1.首先,使用贪心法对这批圆柱形的木材按照它们的半径从大到小进行排序
2.将圆柱体填入集装箱中.
i)先要算出圆柱体应该放在哪个位置.
按照张德富老师课堂上讲的是,放在离已经放到集装箱中的圆柱的圆心长度为r的圆弧带里. 张老师用的是两个圆弧带之间的交点,我的算法有点不大一样,我只是使用一个圆弧带来产生坐标void Generate(int i,int j,int k,int pid),然后判断每个坐标是否合法int CheckOK(int pid,int i).
ii)按照上面的做法,我的算法将产生一系列合法的坐标,然后我再从这些合法的坐标里面选出靠左下角的点,把圆柱体放到该点上去即可.
实验心得.
在实验室做的时候,我一直陷入张德富老师所讲的用两个圆来求第三个圆的位置,
后来问助教老师,助教老师讲的是采用正方体来代替圆,这个方法也蛮不错的.
最后,回到宿舍想了很久,才明白,张老师的意思是从整个圆弧带里面找出合法的坐标填进去就可以了.
在写CheckOK()函数即判断产生的坐标是否合法的函数过程中,也出现了不少的问题.
例如: if(x11+r[i])w+0.00001)
这里头是需要在后面加入一个0.00001,因为两个浮点数之间比较大小,很容易出现舍入误差,这一点是非常重要的. 其实在实际放置木材的过程中,也是要考虑到一些误差问题的,制作出来的木材不可能是标准的圆柱体,往往是有偏差的.实际设计软件的时候,这一点是必须要考虑到的.
据说张老师好像在做开发切割包装系统以及股票预测系统
for(start=1;start=n;start++){
if(r[start]*2+0.0001wr[start]*2+0.0001h){
pos[start][0]=r[start];
pos[start][1]=r[start];
visited[start]=1;
break;
}
}
有关参数SETN的说明:
#define SETN 360 //这个用来设置放木材的精度,为整型,理论上值越大,空间利用率越高,最大值最好不要超过360
SETN用来表示搜索的坐标的精度数,越大精度越高,
double arcCompute=3.1415926*2/SETN;
这个arcCompute是用来产生坐标的间隔.
也就是说:SETN越大,分的角度就越小,结果就越好.
SETN设置小于10和大于100的空间利用率差别是比较大的,大概会差10个百分点左右.
5. sort函数的简单说明:
在程序中我使用了:sort(r+1,r+n+1,cmp);
或许你会觉得奇怪,这个函数的具体定义怎么没有在程序中出现呢.
它是包含在头文件#includealgorithm
四.实验结果.
C20.txt
C25.txt
C30.txt
C35.txt
算法时间复杂度.
O(SETN*n*n)
其中SETN是空间利用率的精度,这在前文已经说明过了.
附Java源代码
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.math.*;
public class expr3 extends Applet{
int i,n=45;
int SETN=30; //这个用于设置图形的大小
String s=new String(123456788);
double x[]={
2.178,6.522,10.629,14.514,18.373,22.180,20.325,16.476,12.609,8.938,4.396,1.505,6.758,22.851,10.679,14.395,18.248,3.658,20.616,1.276,8.553,16.224,12.583,5.600,0,0,23.282,23.326,10.558,14.397,18.758,3.023,0,6.764,0};
double y[]={
2.178,2.178,1.963,1.963,1.963,1.896,5.211,5.121,5.012,5.014,5.214,6.153,7.120,7.407,7.483,7.514,7.748,7.971,9.031,8.981,9.2
文档评论(0)