实现遗传算法的0-1背包问题【精品毕业设计】(完整版)
- 格式:docx
- 大小:512.33 KB
- 文档页数:22
实现遗传算法的0-1背包问题
求解及其改进
学校:
学院:
专业:
姓名:
学号:
课程名称:
指导老师:
一、 问题陈述
0-1背包问题属于组合优化问题的一个例子,求解0-1背包问题的过程可以被视作在很多可行解当中求解一个最优解。
01背包问题的一般描述如下:
给定n 个物品和一个背包,物品i 的重量为Wi ,其价值为Vi ,背包的容量为C 。
选择合适的物品装入背包,使得背包中装入的物品的总价值最大。
注意的一点是,背包内的物品的重量之和不能大于背包的容量C 。
在选择装入背包的物品时,对每种物品i 只有两种选择:装入背包或者不装入背包,即只能将物品i 装入背包一次。
称此类问题为0/1背包问题。
其数学模型为:
在满足∑w i x i ≤C n i=1的条件下求解 max ∑v i x i n i=1 ,其中i =1,2,3,4…,n
0-1背包问题传统的解决方法有动态规划法、分支界限法、回溯法等等。
传统的方法不能有效地解决0-1背包问题。
遗传算法(Genetic Algorithms )则是一种适合于在大量的可行解中搜索最优(或次优)解的有效算法。
二、遗传算法分析与实现
1、遗传算法概述
遗传算法(Genetic Algorithm )是一类借鉴生物界的进化规律(适者生存,优胜劣汰)演化而来的随机化搜索方法。
算法根据问题的目标函数构造一个适值函数,对一个由多个解(每个解对应一个染色体)构成的和种群进行评估、遗传、选择,经多代繁殖,获得适应值最好的个体作为问题的最优解。
其特点是具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不需要确定的规则。
遗传算法的这些性质,已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。
• 遗传算法一般是直接在解空间搜索, 而不像图搜索那样一般是在问题空间
搜索, 最后才找到解(如果搜索成功的话)。
• 遗传算法的搜索随机地始于搜索空间的一个点集, 而不像图搜索那样固定
地始于搜索空间的初始节点或终止节点, 所以遗传算法是一种随机搜索算法。
• 遗传算法总是在寻找优解(最优解或次优解), 而不像图搜索那样并非总是
要求优解, 而一般是设法尽快找到解(当然包括优解), 所以遗传算法又是一种优化搜索算法。
• 遗传算法的搜索过程是从空间的一个点集(种群)到另一个点集(种群)的搜索,
而不像图搜索那样一般是从空间的一个点到另一个点地搜索。
因而它实际
是一种并行搜索, 适合大规模并行计算, 而且这种种群到种群的搜索有能力跳出局部最优解。
•遗传算法的适应性强, 除需知适应度函数外, 几乎不需要其他的先验知识。
•遗传算法长于全局搜索, 它不受搜索空间的限制性假设的约束,不要求连续性, 能以很大的概率从离散的、多极值的、含有噪声的高维问题中找到全局最优解。
2、遗传算法流程
Step 1 参数设置:在论域空间U上定义一个适应度函数f(x),给定种群规模N,交叉率P c和变异率P m,代数T;
Step 2 初始种群:随机产生U中的N个染色体s1, s2, …, s N,组成初始种群S={s1, s2, …, s N},置代数计数器t=1;
Step 3计算适应度:S中每个染色体的适应度f(x i) ;
Step 4 判断:若终止条件满足,则取S中适应度最大的染色体作为所求结果,算法结束。
Step 5 选择-复制:按选择概率P(x i)所决定的选中机会,每次从S中随机选定1个染色体并将其复制,共做N次,然后将复制所得的N个染色体组成群体S1;
Step 6 交叉:按交叉率P c所决定的参加交叉的染色体数c,从S1中随机确定c 个染色体,配对进行交叉操作,并用产生的新染色体代替原染色体,得群体S2;
Step 7 变异:按变异率P m所决定的变异次数m,从S2中随机确定m个染色体,分别进行变异操作,并用产生的新染色体代替原染色体,得群体S3;
Step 8 更新:将群体S3作为新一代种群,即用S3代替S,t=t+1,转步3;
3.程序步骤:
一、使用基本遗传算法解决0- 1背包问题:
1: 打开数据文件
2: 设置程序运行主界面
3: 调用初始化种群模块
3-1: 按照一定的种群规模和染色体长度以基因为单位用随机产生的0-1对个体赋值
3- 2: 调用计算适应度函数
4: 以最大进化代数为循环终止条件开始进行循环
4- 1: 调用产生新一代个体的函数
4- 1- 1: 调用选择函数
4- 1- 2: 调用交叉函数
4- 1- 3: 调用变异函数
4- 1- 4: 调用计算适应度函数
5: 调用计算新一代种群统计数据函数
6: 调用输出新一代统计数据函数
7: 返回到第四步, 直至循环结束
二、基本遗传算法解决0- 1背包问题存在的不足:
1.对于过程中不满足重量限制条件的个体的处理
在用基本遗传算法解决0- 1背包问题的时候,在初始化或者交叉变异后可能会产生不满足重量约束条件的伪解,而对于这些伪解,基本遗传算法没有给出一个很好的处理方法,而只是又随机生成了一个满足约束条件的解作为新的个体从而替换掉原来的个体。
根据遗传算法的根本思想“优胜劣汰,适者生存”的原则,可以将不满足条件的个体用已有的最优个体来进行替换,这样,既使得种群中所有的个体均满足重量的约束条件,又保留了较优解,符合遗传算法的思想。
具体做法为:
在程序中加入一个变量保存每代的最优解,当前代在进行选择、复制、交叉、变异后如果有不满足约束条件的个体,则在种群更新时采用这个最优值作为替代。
具体做法为:在每代遗传后通过函数FindBestandWorstIndividual()找到当前最优
值并保存bestindividual中,在计算适应度函数CalculateFitnessValue()中加入:
if(w>KW) X[i]=bestindividual;//如果不是解,找最好的一个解代之
其中w为当前个体的总重量,KW为背包最大承重量,X[i]表示种群中第i个个体,bestindividual为保存的个体最优解。