用遗传算法解决0 1背包问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实现遗传算法的0-1背包问题求解及其改进
姓名:
学号:
班级:
提交日期:2012年6月27日
实现遗传算法的0-1背包问题求解
摘要:研究了遗传算法解决0-1背包问题中的几个问题:
1)对于过程中不满足重量限制条件的个体的处理,通过代换上代最优解保持种群的进化性
2)对于交换率和变异率的理解和处理方法,采用逐个体和逐位判断的处理方法
3)对于早熟性问题,引入相似度衡量值并通过重新生成个体替换最差个体方式保持种群多样性。4)一种最优解只向更好进化方法的尝试。
通过实际计算比较表明,本文改进遗传算法在背包问题求解中具有很好的收敛性、稳定性和计算效率。通过实例计算,表明本文改进遗传算法优于简单遗传算法和普通改进的遗传算法。
关键词:遗传算法;背包问题;优化
1.基本实现原理:
一、问题描述
0-1背包问题属于组合优化问题的一个例子,求解0-1背包问题的过程可以被视作在很多可行解当中求解一个最优解。01背包问题的一般描述如下:
给定n个物品和一个背包,物品i的重量为Wi,其价值为Vi,背包的容量为C。选择合适的物品装入背包,使得背包中装入的物品的总价值最大。注意的一点是,背包内的物品的重量之和不能大于背包的容量C。在选择装入背包的物品时,对每种物品i只有两种选择:装入背包或者不装入背包,即只能将物品i装入背包一次。称此类问题为0/1背包问题。
其数学模型为:
0-1背包问题传统的解决方法有动态规划法、分支界限法、回溯法等等。传统的方法不能有效地解决0-1背包问题。遗传算法(Genetic Algorithms)则是一种适合于在大量的可行解中搜索最优(或次优)解的有效算法。
二、遗传算法特点介绍:
遗传算法(Genetic Algorithm, GA)是1962年Holland教授首次提出了GA算法的思想是近年来随着信息数据量激增,发展起来的一种崭新的全局优化算法,它借用了生物遗传学的观点,通过自然选择、遗传、变异等作用机制,实现各个个体的适应性的提高。
基本遗传算法求解步骤:
Step 1 参数设置:在论域空间U上定义一个适应度函数f(x),给定种群规模N,交叉率P c和变异率P,代数T;m Step 2 初始种群:随机产生U中的N个染色体s, s, …, s,组成初始种群S={s, s, …, s},NN1212置代数计数器t=1;
计算适应度;中每个染色体的适应度) Step 3f(:S Step 4 判断:若终止条件满足,则取S中适应度最大的染色体作为所求结果,算法结束。
Step 5 选择-复制:按选择概率P(x)所决定的选中机会,每次从S中随机选定1
个染色体并i将其复制,共做N次,然后将复制所得的N个染色体组成群体S;
1Step 6 交叉:按交叉率P所决定的参加交叉的染色体数c,从S中随机确定c个染色体,1c配对进行交叉操作,并用产生的新染色体代替原染色体,得群体S;2Step 7 变异:按变异率P所决定的变异次数m,从S中随机确定m个染色体,分别进行2m变异操作,并用产生的新染色体代替原染色体,得群体S;3Step 8 更新:将群体S作为新一代种群,即用S;3,转步+1t=t,S代替33.
遗传算法是一种仿生算法, 即模拟生命演化的算法,它从一个代表问题初始解的初始种群出发, 不断重复执行选择, 杂交和变异的过程, 使种群进化越来越接近某一目标既最优解,如果视种群为超空间的一组点, 选择、杂交和变异的过程即是在超空间中进行点集之间的某种变换, 通过信息交换使种群不断变化,遗传算法通过模拟达尔文“优胜劣汰, 适者生存”的原理激励好的结构, 同时寻找更好的结构, 作为一种随机的优化与搜索方法, 遗传算法有着其鲜明的特点。—遗传算法一般是直接在解空间搜索, 而不像图搜索那样一般是在问题空间
搜索, 最后才找到解(如果搜索成功的话)。
—遗传算法的搜索随机地始于搜索空间的一个点集, 而不像图搜索那样固定
地始于搜索空间的初始节点或终止节点, 所以遗传算法是一种随机搜索算法。—遗传算法总是在寻找优解(最优解或次优解), 而不像图搜索那样并非总是要
求优解,
当然包括优解), 所以遗传算法又是一种优化搜索算法。而一般是设法尽快找到解(—遗传算法的搜索过程是从空间的一个点集(种群)到另一个点集(种群)的搜索,而不像图搜索那样一般是从空间的一个点到另一个点地搜索。因而它实际是一种并行搜索, 适合大规模并行计算, 而且这种种群到种群的搜索有能力跳出局
部最优解。
, 几乎不需要其他的先验知识。—遗传算法的适应性强, 除需知适应度函数外—遗传算法长于全局搜索, 它不受搜索空间的限制性假设的约束,不要求连续性, 能以很大的概率从离散的、多极值的、含有噪声的高维问题中找到全局最优解。
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为保存的个体最优解。
2.对于交换率和变异率的理解和处理方法
根据遗传算法的基本步骤的交叉和变异操作
Step 6 交叉:按交叉率P所决定的参加交叉的染色体数c,从S中随机确定c个染色体,1c配对进行交叉操作,并用产生的新染色体代替原染色体,得群体S;2Step 7 变异:按变异率P所决定的变异次数m,从S中随机确定m个染色体,
分别进行2m变异操作,并用产生的新染色体代替原染色体,得群体S;3可以
有两种处理方法:
其一,采用先确定数目在随机选取的方法,步骤如下:
对于交叉操作:对于变异操作:
1,根据交叉率确定应该交叉的个体数目1,根据变异率确定应该变异的染色体数n 目n
2,在种群中进行n次循环2,在种群中进行n次循环
2-1随机选中种群中的一个个体a 2-1随机选中种群中的一个个体的染2-2随机选中种群中异于a的一个个色体a
体b
2-2随机选中染色体a的某位基因2-3随机确定交叉位数
2-4进行交叉2-3对进行0-1互换变异