用遗传算法解决01背包问题要点Word文件下载.docx

上传人:b****4 文档编号:7236296 上传时间:2023-05-08 格式:DOCX 页数:31 大小:451.48KB
下载 相关 举报
用遗传算法解决01背包问题要点Word文件下载.docx_第1页
第1页 / 共31页
用遗传算法解决01背包问题要点Word文件下载.docx_第2页
第2页 / 共31页
用遗传算法解决01背包问题要点Word文件下载.docx_第3页
第3页 / 共31页
用遗传算法解决01背包问题要点Word文件下载.docx_第4页
第4页 / 共31页
用遗传算法解决01背包问题要点Word文件下载.docx_第5页
第5页 / 共31页
用遗传算法解决01背包问题要点Word文件下载.docx_第6页
第6页 / 共31页
用遗传算法解决01背包问题要点Word文件下载.docx_第7页
第7页 / 共31页
用遗传算法解决01背包问题要点Word文件下载.docx_第8页
第8页 / 共31页
用遗传算法解决01背包问题要点Word文件下载.docx_第9页
第9页 / 共31页
用遗传算法解决01背包问题要点Word文件下载.docx_第10页
第10页 / 共31页
用遗传算法解决01背包问题要点Word文件下载.docx_第11页
第11页 / 共31页
用遗传算法解决01背包问题要点Word文件下载.docx_第12页
第12页 / 共31页
用遗传算法解决01背包问题要点Word文件下载.docx_第13页
第13页 / 共31页
用遗传算法解决01背包问题要点Word文件下载.docx_第14页
第14页 / 共31页
用遗传算法解决01背包问题要点Word文件下载.docx_第15页
第15页 / 共31页
用遗传算法解决01背包问题要点Word文件下载.docx_第16页
第16页 / 共31页
用遗传算法解决01背包问题要点Word文件下载.docx_第17页
第17页 / 共31页
用遗传算法解决01背包问题要点Word文件下载.docx_第18页
第18页 / 共31页
用遗传算法解决01背包问题要点Word文件下载.docx_第19页
第19页 / 共31页
用遗传算法解决01背包问题要点Word文件下载.docx_第20页
第20页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

用遗传算法解决01背包问题要点Word文件下载.docx

《用遗传算法解决01背包问题要点Word文件下载.docx》由会员分享,可在线阅读,更多相关《用遗传算法解决01背包问题要点Word文件下载.docx(31页珍藏版)》请在冰点文库上搜索。

用遗传算法解决01背包问题要点Word文件下载.docx

0-1背包问题传统的解决方法有动态规划法、分支界限法、回溯法等等。

传统的方法不能有效地解决0-1背包问题。

遗传算法(GeneticAlgorithms)则是一种适合于在大量的可行解中搜索最优(或次优)解的有效算法。

二、遗传算法特点介绍:

遗传算法(GeneticAlgorithm,GA)是1962年Holland教授首次提出了GA算法的思想是近年来随着信息数据量激增,发展起来的一种崭新的全局优化算法,它借用了生物遗传学的观点,通过自然选择、遗传、变异等作用机制,实现各个个体的适应性的提高。

基本遗传算法求解步骤:

Step1参数设置:

在论域空间U上定义一个适应度函数f(x),给定种群规模N,交叉率Pc和变异率Pm,代数T;

Step2初始种群:

随机产生U中的N个染色体s1,s2,…,sN,组成初始种群S={s1,s2,…,sN},置代数计数器t=1;

Step3计算适应度:

S中每个染色体的适应度f(

);

Step4判断:

若终止条件满足,则取S中适应度最大的染色体作为所求结果,算法结束。

Step5选择-复制:

按选择概率P(xi)所决定的选中机会,每次从S中随机选定1个染色体并将其复制,共做N次,然后将复制所得的N个染色体组成群体S1;

Step6交叉:

按交叉率Pc所决定的参加交叉的染色体数c,从S1中随机确定c个染色体,配对进行交叉操作,并用产生的新染色体代替原染色体,得群体S2;

Step7变异:

按变异率Pm所决定的变异次数m,从S2中随机确定m个染色体,分别进行变异操作,并用产生的新染色体代替原染色体,得群体S3;

Step8更新:

将群体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为保存的个体最优解。

2.对于交换率和变异率的理解和处理方法

根据遗传算法的基本步骤的交叉和变异操作

按交叉率Pc所决定的参加交叉的染色体数c,从S1中随机确定c个染色体,配对进行交叉操作,并用产生的新染色体代替原染色体,得群体S2;

按变异率Pm所决定的变异次数m,从S2中随机确定m个染色体,分别进行变异操作,并用产生的新染色体代替原染色体,得群体S3;

可以有两种处理方法:

其一,采用先确定数目在随机选取的方法,步骤如下:

对于交叉操作:

1,根据交叉率确定应该交叉的个体数目n

2,在种群中进行n次循环

2-1随机选中种群中的一个个体a

2-2随机选中种群中异于a的一个个体b

2-3随机确定交叉位数

2-4进行交叉

对于变异操作:

1,根据变异率确定应该变异的染色体数目n

2-1随机选中种群中的一个个体的染色体a

2-2随机选中染色体a的某位基因

2-3对

进行0-1互换变异

其二,采用对每个操作单元分别进行特定概率下处理的方法,步骤如下:

1,在种群中进行S次循环,其中S代表种群中个体的数量

2,对于每一个个体X[i](X为种群数组)做如下操作

2-1生成随机数p

[0,1],判断p与

的大小关系

2-2如果p

说明X[i]需要交换

2-2-1随机在种群中找到异于X[i]的另一个体进行交换

2-3如果p

说明X[i]不需要交换

2,对每一个个体X[i]做N次循环,其中N为染色体位数

2-1对染色体的每一位

3-1生成随机数q

[0,1],判断q与

的大小关系

3-2如果q

说明

需要进行0-1互换变异2-3如果q

不需要变

分析这两种处理方法可知:

方法一没有很好地体现随机机会均等的思想,因为在步骤1中确定的需要操作的数目n后,总体上是保证了交叉或者变异的数目,但不是对于每一个个体而言的,因而会出现有的个体被选择交叉或者变异多次而有的没有机会交叉或者变异的情况,而如果采用方法二,就体现了机会的均等性,即要求对每一个单元操作目标进行概率的验证,以确定是否变异或者交叉。

在程序中具体的实现方法体现在交叉和变异函数中:

voidCrossoverOperator(void)//交叉操作

for(i=0;

i<

S;

i++)

do{p=rand()%S;

//两个[0,S]的随机数

q=rand()%S;

}while(p==q);

intw=1+rand()%N;

//[1,N]交换的位数

doublep=(rand()%1001)/1000.0;

if(p<

=Pc)

for(j=0;

j<

w;

j++)交换w位数据

voidMutationOperator(void)//变异操作

for(i=0;

i++)

for(j=0;

j<

N;

j++)

q=(rand()%1001)/1000.0;

//产生q

[0,1]

if(q<

Pm)//对每一位都要考虑

if(X[i].chromsome[j]==1)X[i].chromsome[j]=0;

elseX[i].chromsome[j]=1;

2.对于算法早熟性的分析及解决方法

遗传算法中种群中的个体由初始化时的具有多样性,可能会由于在进化过程中一些超常个体限制其它个体的进化——这个个体的适应度大大优于种群内的其它值,由于适者生存原则这个个体被不断复制从而充满了整个种群,使得种群的多样应大大降低,进化停滞,从而出现算法收敛于局部最优解的现象,称为早熟现象。

早熟现象的可能解法:

1)通过提高变异率来增加种群的多样性,以期更优解的出现,这也是最简单基本遗传算法中不添加相关操作的情况下唯一的一种方法,然而这种方法有明显的弊端:

在提高变异率获得多样性种群的同时,个体变异的机会增加,使得较优解发生变异,从而遗传算法丧失了其优于其它算法的优越性,所以这种方法不是很好地解决方法。

2)引入多样性衡量和处理

基本思路:

在出现进化停滞现象时要引入新的个体来增强种群的多样性。

做法:

1,判断是否达到早熟现象

对于种群中S个个体,判断等位基因的相等程度,即引入一个参数值same,如果same达到一定的理论值大小就可以认为达到了早熟现象。

2,早熟现象的处理,即引入新的个体。

处理过程中应该不违反适者生存的原则,所以应该保留较好的个体,所以首先选中适应度最小的个体执行删除操作,然后随机生成一个新的符合重量限制且打破早熟现象的新个体。

具体实现见函数:

voidcheckalike(void)

//相似度校验

for(i=0;

i<

i++)

j++)

booltemp=X[i].chromsome[j];

for(intk=1;

k<

k++)

if(temp!

=X[k].chromsome[j])

break;

if(j==N)same++;

if(same>

N*0.5)//大于50%作为判定为早熟

//确定最小

intminindex=0;

for(intn=0;

n<

n++)if(X[n].fitness<

X[minindex].fitness)minindex=n;

//重新生成

for(j=0;

j++)

boolm=(rand()%10<

5)?

0:

1;

X[minindex].chromsome[j]=m;

X[minindex].weight+=m*weight[j];

//个体的总重量

X[minindex].fitness+=m*value[j];

//个体的总价值

3.一种最优解只向更好进化方法的尝试

基本思路为:

每一组的最优解是一个独特的个体,我们求解的问题最终的最优解或者近似解都产生于这个特殊的个体,最优解只向更好进化方法中规定:

每代中选出一个最优解并做好相应的记录或者标记,最优解参与交叉和变异,只是在交叉或者变异时对最优解进行前后适应度的比较,如果发现交叉或者变异后适应度大于操作前适应度,则保存操作后的结果,如果发现交叉或者变异后适应度小于操作前适应度,则禁止最优解的操作,而不禁止与最优解进行交叉的个体的变化。

这样,每一代中的最优解的特性可以通过交叉传递给同代中的其它个体,而保证种群一定会向更好的方向进化。

做法在交叉后和变异后调用以下函数判断:

intcomp(individualbestindividual,individualtemp)//比较函数

{

intfit=0,w=0;

//第一种不变:

操作后不满足重量函数,第二种:

操作后适应度小于操作前

for(inti=0;

i++){fit+=temp.chromsome[i]*value[i];

w+=temp.chromsome[i]*weight[i]}

if(w>

KW)return-1;

return(bestindividual.fitness>

fit?

-1:

1);

//如果小于原来值或者不满足重量函数,则返回-1

}

三、改进的遗传算法解决0-1背包问题:

1、参数设置:

#defineS500//种群的规模

#definePc0.8//交叉概率

#definePm0.01//突变概率

#defineKW878//背包最大载重

#defineN20//物体总数

#defineT1000//最大换代数

2个体的表示和染色体编码

用变量i代表物件,i=1,2,,n定义变量xi,其含义为:

xi=1表示:

第i个物件被选入背包,xi=0表示第i个物件没有被选入背包。

考虑n个物件的选择与否,就可以得到一个长度为n的0,1序列。

由此可见遗传算法应用于上述背包问题时,采用简单二进制编码较为适宜1每一组编码即为某一个个体的基因表示,称其为染色体,染色体长度取决于待分配的物件的个数n.在编码形式的表示方法中,形如二进制编码10010101表示为一个待分配的物件的个数为8(编码长度)的一个背包问题的一个解,则该个体对应于选择了物件1,4,6,8,即第1,4,6,8个物品被放入了背包。

用数据格式表示为:

structindividual//个体结构体

boolchromsome[N];

//染色体编码

doublefitness;

//适应度//即本问题中的个体所得价值

doubleweight;

//总重量

};

2产生初始种群

n个待分配的物件随机产生S个长度为n的二进制串,即种群中个体的染色体编码的每一位按等概率在0与1中选择S指的是种群规模,即种群中的个体数目.

voidGenerateInitialPopulation(void);

//初始种群

3适应度函数

背包内物件的总重量为a1x1+a2x2+,anxn,物件的总价值为c1x1+c2x2+,+cnxn

0-1背包问题中采用每个个体的总价值作为适应度,在满足背包容量的条件下,价值越大,适应度越高。

所以适应度求解方法为:

fi=c1x1+c2x2+,+cnxn(当ta1x1+a2x2+,+anxn<

=c,xj=0,1)

考虑到会有不不满足容量条件的个体则:

fi=0(当a1x1+a2x2+,+anxn>

c,xj=0,1)

上述适应度函数基于一个考虑违背约束条件的惩罚处理,根据上述具体问题适应度函数值不可能为零,所以当随机产生的某个个体违背约束条件时,通过把其适应度函数值罚为0而达到淘汰该个体的目的。

4选择-复制操作

参照适应度函数值和约束条件用赌轮选择法进行模拟,具体为:

(1)根据适应度函数值和约束条件,罚掉部分个体(前述不满足容量条件的个体)

(2)对于满足约束条件的个体,根据适应度函数值计算个体被选中的概率,称为选择概率:

公式为:

P

=

p(

)称为染色体xi(i=1,2,…,n)的选择概率

(3)根据轮盘赌累计公式为:

称为染色体xi(i=1,2,…,n)的积累概率

(4)对已得到的累计概率作如下处理,完成选择操作:

1)在[0,1]区间内产生一个均匀分布的伪随机数r。

 2)若r≤q1,则染色体x1被选中。

3)若qk-1<

r≤qk(2≤k≤N),则染色体xk被选中。

对于n个个体,要进行n次选择,所以产生n个[0,1]之间的随机数,相当于转动n次轮盘,获得n次转盘停止时的指针位置,指针停止在某一扇区,该扇区代表的个体既被选中(如右图),被选中的个体进行赋值操作进入下一代,复制过程要进行S次(S为种群的规模)。

5交叉操作:

对于每一个个体,根据交叉率Pc做如下操作:

(1)随机产生一个交叉点的位置

(2)随机选取当前代中的两个个体作为父个体

(3)根据交叉点的位置,做单点交叉

6变异操作:

根据变异率Pm

(1)随机产生变异点的位置

(2)在变异点位置作0-1翻转

8、算法终止

程序中定义了一个最优值,stop=

一般情况下这个最优值达不到,一旦程序在执行过程中达到此最优值,也就没有必要在执行下去,因为这必定是最好的解,所以保存最优值和最优解,结束。

如果程序的最优值达不到理想情况下的stop,那么根据最大换代次数来结束程序,在结束后的种群中找到一个最好的解作为本问题的最优解,程序结束。

4算例(可以使用参考文献[2]中的典型算例):

1.小规模问题的算例:

算例1-1:

设定物品价值value={50,30,60,80,20}重量weight{35,40,40,20,15}背包的最大承重量为100

遗传算法中参数:

群体大小S=5,交叉率Pc=0.8,变异率Pm=0.05,最大换代次数T=20,

通过多次试验比较本文改进后遗传算法和其他得到结果如下表所示:

(右图中输出第一行数为最优价值;

第二行数为重量;

第三行为最优解)

本文改进的遗传算法:

实验总次数:

30

达到全局最优解次数:

27

未达到全局最优解:

3效果截图

由实验结果可知在小规模算例中,本文改进的遗传算法优于前两者。

2.较大规模问题求解算例:

群体大小S=5,交叉率Pc=0.8,变异率Pm=0.05,最大换代次数T=800,相似度取5%

实例1:

价值value:

{92,4,43,83,84,68,92,82,6,44,32,18,56,83,25,96,70,48,14,58}

重量weight:

{{44,46,90,72,91,40,75,35,8,54,78,40,77,15,61,17,75,29,75,63}}

背包的最大承重量:

878

实例2:

价值value:

{220,208,198,192,180,180,165,162,160,158,155,130,125,122,120,118,115,110,105,101,100,100,98,96,95,90,88,82,80,77,75,73,72,70,69,66,65,63,60,58,56,50,30,20,15,10,8,5,3,1};

重量weight:

{80,82,85,70,72,70,66,50,55,25,50,55,40,48,50,32,22,60,30,32,40,38,35,32,25,28,30,22,25,30,45,30,60,50,20,65,20,25,30,10,20,25,15,10,10,10,4,4,2,1};

背包最大承重量:

1000

实例3:

(说明:

参考论文中的实例3价值数组中缺少一个值,这里以0补上,使价值和重量一一对应)

{597,596,593,586,581,568,567,560,549,548,547,529,529,527,520,491,482,478,475,475,466,462,459,458,454,451,449,443,442,421,410,409,395,394,390,377,375,366,361,347,334,322,315,313,311,309,296,295,294,289,285,279,277,276,272,248,246,245,238,237,232,231,230,225,192,184,183,176,171,169,165,165,154,153,150,149,147,143,140,138,134,132,127,124,123,114,111,104,89,74,63,62,58,55,48,27,22,12,6,0};

{54,183,106,82,30,58,71,166,117,190,90,191,205,128,110,89,63,6,140,86,30,91,156,31,70,199,142,98,178,16,140,31,24,197,101,73,16,73,2,159,71,102,144,151,27,131,209,164,177,177,129,146,17,53,64,146,43,170,180,171,130,183,5,113,207,57,13,163,20,63,12,24,9,42,6,109,170,108,46,69,43,175,81,5,34,146,148,114,160,174,156,82,47,126,102,83,58,34,21,14};

各运行30次后比较30次中的最好值,比较结果如下本文改进的遗传算法和先前算法结果如下:

本文改进遗传算法实验结果:

实例1:

(输出第一行数为最优价值;

实例3:

根据得到最优解的情况本文改进的遗传算法

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2