最优化方法课程大作业实验流水线问题元启发及超启发算法_第1页
最优化方法课程大作业实验流水线问题元启发及超启发算法_第2页
最优化方法课程大作业实验流水线问题元启发及超启发算法_第3页
最优化方法课程大作业实验流水线问题元启发及超启发算法_第4页
最优化方法课程大作业实验流水线问题元启发及超启发算法_第5页
已阅读5页,还剩6页未读 继续免费阅读

最优化方法课程大作业实验流水线问题元启发及超启发算法.docx 免费下载

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

文档简介

经典word整理文档,仅参考,双击此处可删除页眉页脚。本资料属于网络整理,如有侵权,请联系删除,谢谢!流水线调度问题求解XXX(:XXXXXXXX)摘要:有N个工件同时到达流水线上,给出一个加工顺序排列使得最后一个工件从流水线最后一台机器加工关键词:flowshop多机调度遗传算法元启发式算法超启发式算法1a)流水车间(FlowShop)调度问题是很多实际流水线生产调度问题的简化模型,也是一个典型的NP-hard问题,因此其研究具有重要的理论意义和工程价值,也是目前研究最广泛的一类典型调度问题。b)已知:有n个工件需要在m台机器上流水加工。工件上的约束:所有工件均在0时刻释放且在各机器上的加工顺序相同,每个工件在每台机器上只加工一次。机器上的约束:每个机器某一个时刻最多只能加工一个工件,而且执行过程是非抢占的。目标:给出调度方案,使调度总完工时间最小。要求:算法复杂度在多项式时间内。c)对于工件加工顺序的排列,可以看成是一段DNA序列,这段DNA序列可以交换片段的位置,可以改变两个碱基对的位置,分别对应基因的交叉与突变。而给所有排列(基因)一个生存空间,并定期淘汰掉来的基因一定是更优的。本文后续部分组织如下。第2节详细陈述使用的方法,第3节报告实验结果,第4节对讨论本文的方法并总结全文。2遗传算法对于流水线问题,遗传算法相比于其他群智能算法能更加贴近问题,更容易实现,因此我采用了遗传算法对该问题进行求解。具体设计思路如下:遗传算法就是模拟了自然界中物竞天择,适者生存的法则,通过生物的不断变异和自然选择,遗传留下优秀的基因,淘汰不适应选择条件的基因。对于工件加工顺序的排列,可以看成是一段DNA序列,第i个碱基对上的编码c表示第i个加工第c个工件。每个排列可看成一个细菌。在程序中,我使用一条链表来表示一个DNA链。这段DNA序列可以交换片段的位置,可以改变两个碱基对的位置,分别对应基因的交叉与突变。繁殖相当于复制链表并对链表进行交叉互换与碱基对互换。使用链表表示为片段与碱基的交换提供了方便。给一个细菌一个生存空间,在初始阶段,细菌会大量地繁殖而导致数量呈指数型地增长。程序通过随机或贪心生成一条初始的排列,每过一段时间完成一轮繁殖。当链的数量小于生存容量时,DNA链的每一轮、每一个都会繁殖一条新的链,因此链的数量呈现指数型增长。当数量大于生存空间的容量时,则需要淘汰一些劣质的DNA链。淘汰规则有轮盘赌、锦标赛等等,轮盘赌即解更优的留下的概率更大,弱者也有概率留下,而锦标赛是严格的适者生存,留下的都是时间较小的,这里我使用的是锦标赛规则。对总时间进行排序,杀死并销毁排名在生存榜上排名较后2的DNA链。并让留下来的DNA链进行下一轮繁殖与竞争。不断迭代,经过很多代的演化后,遗传下来的基因一定是更优的。主要代码如下:structgeneNode{intp;//碱基对,相当于脱氧核苷酸,形成链表//编码,指向的工件号structgeneNode*next;};//指向下一个碱基对GeneNode*createNode();classGene{//新建一个碱基对//每一个基因即生存的个体private:GeneNode*head;intTotalTime;public://基因的第一个节点//花费的总时间Gene();//初始化的构造函数Gene(constGene&b);Gene(GeneNode*dna);Gene(Geneb,intflag);~Gene();//拷贝构造函数//为dna链构造对象//相当于复制一个b(链是新链,flag无意义)复制//析构函数死亡intcalculateTotalTime();//计算总时间GeneNode*copyDNA(GeneNode*p);//复制DNA链voiddeleteDNA(GeneNode*p);//删除并销毁DNA链booloperator<(constGene&a)const;GeneNode*recombination(GeneNode*dna);//基因重组voidmutation(GeneNode*dna);GeneNode*propagate();voidsetDNA(GeneNode*i);voidkill();//基因突变//繁殖后代。先复制一条链,并产生变异//设置基因头节点//杀死该个体并释放DNA链表的空间//将链状DNA递归输出//将基因输出voidprintDNA(GeneNode*i);voidprintGene();};Geneq[MAX_CAPCITY*2];GeneNode*init();//生存空间,物竞天择,适者生存//初始化一个基因夏娃voidschedule();//进行调度,算法的主体涉及DNA链表的操作为数据结构基础,这里不再详解,只对主要的函数schedule进行讲解。voidschedule(){intnum=1;q[0].setDNA(init());//初始化一个基因夏娃while(num<MAX_CAPCITY){inttmp=num;//数量小于容量,生存空间足够,指数繁殖for(inti=0;i<tmp;i++,num++){//一轮繁殖,每一个DNA都产生一个新个体q[tmp+i].setDNA(q[i].propagate());3}}printProcess(0);sort(q,q+num);while(1){//排序,保留容量数的个体//繁殖一倍淘汰一半for(inti=0;i<MAX_CAPCITY;i++)//保留个体继续繁殖q[MAX_CAPCITY+i].setDNA(q[i].propagate());sort(q,q+MAX_CAPCITY*2);currentTime=clock();if((currentTime-startTime)/CLOCKS_PER_SEC>BREAKTIME)break;//一直运行,直到超时退出printProcess(0);}printProcess(1);q[0].print();}元启发式算法元启发式算法是一个随机化算法,是对启发式规则的改进。启发式算法是一种确定性算法,对于启发式规则来说,需要找到一种策略,使得任意两个碱基对之间满足该规则约束,贪心算法就是一种典型的启发式算法。对于元启发来说,基因会发生变异,而且是否发生变异、基因片段交换的位置等都是通过随机生成的,它是随机算法与局部搜索结合的产物。由于随机的存在,搜索可以跳出局部最优的限制,在整个解空间中搜索。当迭代的次数趋于无穷大时,理论上元启发式算法可以得到问题最优解。GeneNode*Gene::propagate(){GeneNode*a=copyDNA(head);if(probability(PROBABILITY1))a=recombination(a);if(probability(PROBABILITY2))mutation(a);returna;}繁殖的时候有PROBABILITY1的概率基因重组,PROBABILITY2的概率发生基因突变,由于遗传算法与自然界生物还是有一定差别,当概率太小时会导致大量无用的重复解,降低算法效率。因此变异的概率很大。交叉表示从一个随机的节点开始前后互换。突变表示任意两个结点的编码内容交换。GeneNode*Gene::recombination(GeneNode*dna){inta=rand()%n;dna=dna[a:n]+dna[0:a-1];returndna;}voidGene::mutation(GeneNode*dna){inta=rand()%n;intb=rand()%n;dna[a]<->dna[b];}4具体实现见代码。超启发式算法由于元启发算法所搜寻的是问题的解空间,虽然寻优能力强,但是当问题规模一大搜索的效率就会非常的低,因此要使用一个规则库对搜寻进行约束,这便是超启发算法。超启发算法是对元启发的一种改进,通过一种高层的策略操纵与组合底层的启发式规则。底层启发式规则包括各种贪心或其他算法,一般由问题专家给出。这些底层规则组成一个规则库,而高层控制策略通过随机组合底层启发式规则对问题进行求解。因此,超启发算法通过底层启发式规则剪枝压缩搜索空间,从而提高搜索效率。为了方便,程序采取了六种常用的贪心策略——时间小的先运行,每次变异时选择一种贪心规则,当交换的片段满足贪心规则时才进行变异,否则递归选取两个新的节点直到基因发生变异。策略库伪代码StrategyN(){If(变异片段满足贪心规则N)变异并return;ElsestrategyN();//递归直到发生变异}顶层控制策略choose(){probability1:Strategy1();probability2:Strategy2();probability3:Strategy3();probability4:Strategy4();probability5:Strategy5();probability6:Strategy6();}33.1实验设置本程序实验环境为DevC++,平均运行时间6秒左右。在DevC++中打开.cpp文件,将#9-#15的参数调好(实验用例均使用的默认参数)测试用例文件分别为instance[10-14。编译即可运行。3.2实验结果元启发算法5测试用例1运行结果测试用例2运行结果6测试用例3运行结果测试用例4运行结果7测试用例5运行结果超启发算法测试用例1运行结果8测试用例2运行结果测试用例3运行结果9测试用例4运行结果测试用例5运行结果由于该算法是随机性算法,因此还是使用表格来统计多次运行的结果测试用例启发式遗传算法运行结果超启发式遗传算法运行结果17038703870387038703870387038703870387038716671667038703870387038703870387038703870387038716671662107166716671887166716671667166716673127366731273127366736673127312731273668003800380038003800380038003800380038003772077387720772077207720772078477720772071667166718871667166716671667166731273667366731273127503736673127366736680038003800380038003800380038003800380037720772077387738782277207720773877277720345由表格可以看出,启发式遗传算法所得到的解离散度更小,因为对于问题规模不大的情况下,搜索全部解空间得到最优解的概率更大,但是如果问题规模较大时漫无目的的搜索只会导致搜索的效率大大降低。超启发式算法得到最优解的概率小,但是搜索效率较高,是‘有选择的’搜索,但是可能有时会把最优解所在区域排除掉。两种算法互有顾忌,应该依赖实际情况进行选择。4本次实验使用了元启发算法与超启发算法对问题进行求解,算法的框架为遗传算法,因为遗传算法能够很好

温馨提示

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

评论

0/150

提交评论