遗传算法求解01背包问题.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
遗传算法求解01背包问题 一、问题描述 01背包问题属于组合优化问题的一个例子,求解01背包问题的过程可以被视作在很多可行解当中求解一个最优解。01背包问题的一般描述如下: 给定n个物品和一个背包,物品i的重量为Wj,其价值为匕,背包的容量为C。选择合适的物品装入背包,使得背包中装入的物品的总价值最大。注意的一点是,背包内的物品的重量之和不能大于背包的容量C。在选择装入背包的物品时,对每种物品i只有两种选择:装入背包或者不装入背包,即只能将物品i装入背包一次。称此类问题为0/1背包问题。 01背包问题是NP问题,传统的解决方法有动态规划法、分支界限法、回溯法等等。传统的方法不能有效地解决01背包问题。遗传算法(GeneticAlgorithms)则是一种适合于在大量的可行解中搜索最优(或次优)解的有效算法。 二、遗传算法 1、遗传算法的基本思想 遗传算法的搜索从一个被称作种群的候选解集开始,新的种群由旧的种群中产生以期得到更好的种群。从旧种群中按照解的适应度来选择解以产生新的解;适应度越大,解被选择生成后代的机率也越大。这个从已有种群中选择双亲并产生后代的迭代过程持续到遗传算法的停止条件满足为止。 2、遗传算法的基本元素。 遗传算法由以下几个原素组成:由染色体组成的种群,根据适应度进行选择以及交叉产生后代。 三、用遗传算法求解01背包问题 1、01背包问题中染色体的表示。 用向量X来表示染色体, X={X]x2,,xn}。,xie{0,1}, Xj=1表示物品i装入了背包,xj=0表示物品i未装入背包。 每个染色体对应其当前装入背包的物品的总价值和总重量。背包中物品的中价值代表了该物品的适应度。 程序中定义了这样的一个结构来表示染色体: typedefstruct{intWeight;〃染色体代表的物品的总重量intFitness;〃染色体代表的物品的价值(适应度)intGene[NUMG];//用元素取值于定义域{0,1}的数组表示染色体。 }GENE; 2、遗传算法求解01背包问题时用到的参数。 POPSIZE:种群大小,即已知的可行解的个数。 NUMG:染色体中基因的个数,即物品的总数。 CAPACITY:背包的容量。 MAXB:二进制表示的染色体换算之后的最大十进制整数。用于随机产生一个整数,进而转换作染色体。 SIM:染色体之间的相似度阈值。当染色体之间的相似度达到阈值时,算法即停止运行。 PC=1.0:交叉概率为100%。 PM=0.2:变异概率为20%,变异可以保证种群的多样性,从而防止算法收敛于某个局部解。 3、选择操作。 选择操作采用了赌轮选择(Roulette-wheelselection)的方法。函数seiectindex()中包含了选择染色体的具体过程。其流程图如图1所示。 图1赌轮选择流程图 程序中用一个Begin来代表当前赌轮上的指针的位置,End则用来使赌轮循环转动。 用summaryBE表示当前赌轮上的指针转过的染色体的总价值。 用summaryF表示当前全部染色体的价值总和。 用randProb作为染色体选择的阈值。randProb为介于[0,1]之间的随机数。 选择使summaryBE/summaryF大于阈值randProb的染色体作为要选择的染色体。 4、交叉操作 程序中采用了单点交叉的策略。如下程序代码所示: for(intj=0;jpartPos;j++){nextGenome[i].Gene[j]=parentGenome[Father].Gene[j];nextGenome[i+POPSIZE/2].Gene[j]=parentGenome[Mother].Gene[j]; } for(jNUMGj++){nextGenome[i].Gene[j]=parentGenome[Father].Gene[j];nextGenome[i+POPSIZE/2].Gene[j]=parentGenome[Mother].Gene[j]; } partPos为随机产生的整数,代表交叉的位置。第一个for循环将partPos位置之前的基因遗传给一个后代,而第二个循环则将partPos位置之后的基因进行了交换。 calculateCapacity函数用于计算交叉操作后的染色体的容量。 calculateFitness函数用于计算交叉操作后的染色体的适应度。 checkCapacity函数则用于检查交叉后的染色体的合理性,容量超出背包的染色体是不合理的。这里没有使后代死亡,而是随机地调整了染色体中的基因。使得基因能够适应环境(背包的容量)而继续生存。 5、精英策略 精英策略为了不使最优解在交叉的过程中,不会丢失最优解而采取的策略。其思想是保存上一代中的适应性强的染色体。相应地取代下一代中适应性弱的

文档评论(0)

gaozhigang + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档