ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:32.74KB ,
资源ID:5867349      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5867349.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(01背包遗传算法代码说明.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

01背包遗传算法代码说明.docx

1、01背包遗传算法代码说明01背包遗传算法一、算法说明:遗传算法是具有“生成+检测”的迭代的搜索算法。它的基本处理流程如图所示。 使用基本遗传算法解决0- 1背包问题的程序步骤如下 1: 设置种群的规模、交叉概率、突变概率、背包最大载重等常数 2: 设置物品的重量和价值 3: 调用初始化种群模块 3- 1: 按照一定的种群规模和染色体长度以基因为单位用随机产生的0- 1对个体赋值 3- 2: 调用计算适应度函数 4: 以最大进化代数为循环终止条件开始进行循环 4- 1: 调用产生新一代个体的函数 4- 1- 1: 调用选择函数 4- 1- 2: 调用交叉函数 4- 1- 3: 调用变异函数 4-

2、 1- 4: 调用计算适应度函数 5: 调用计算新一代种群统计数据函数 6: 调用输出新一代统计数据函数 7: 返回到第四步, 直至循环结束2、结果分析 蓝色字表示 输出结果 运行时间表示 算法复杂度 1)数据集一:物体总个数为30时 物品价值: 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 物品重量: 80 82 85 70 72 70 66 50 55 25 50 55 40 48 50 32 22 60 30 3

3、2 40 38 35 32 25 28 30 22 25 30背包容量 1000-最优值 2984.000000对应重量 995.000000线性解: 1 1 0 1 1 1 0 1 1 1 1 1 1 1 0 1 1 0 1 1 1 1 0 1 1 0 0 1 1 0运行时间: 16 ms 2)数据集二:物体总个数为50时物品价值: 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 6

4、5 63 60 58 56 50 30 20 15 10 8 5 3 1 物品重量: 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-最优值 3010.000000对应重量 993.000000线性解: 1 0 0 1 1 1 0 1 0 1 1 1 1 1 0 1 1 1 1 1 0 0 1 1 1 1 1 1 1 0 0 0 0 0

5、 1 0 1 0 0 1 0 0 0 0 0 0 1 1 1 0运行时间: 31 ms 3)数据集三:物体总个数为60时物品价值: 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 23

6、8 237 物品重量: 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背包容量 1000-最优值 9738.000000对应重量 997.000000线性解: 1 0 0 1 1 1 1 0 0 0 1 0 0 0 0 1 1

7、1 0 0 1 0 0 1 1 0 0 0 0 1 0 1 1 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0运行时间: 19297 ms代码:#include #include#include#include#include/*数据集一*#define S 5 /种群的规模#define Pc 0.8 /交叉概率#define Pm 0.05 /突变概率#define KW 1000 /背包最大载重1000#define N 30 /物体总数#define T 800 /最大换代数#define ALIKE 0.05 /判定相似度i

8、nt stop=0; /初始化函数中初始化为所有价值之和int t=0; /目前的代数int 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;int weight=80,82,85,70,72,70,66,50,55,25,50,55,40,48,50,32,22,60,30,32,40,38,35

9、,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;/*数据集二*/ #define S 5 /种群的规模#define Pc 0.8 /交叉概率#define Pm 0.05 /突变概率#define KW 1000 /背包最大载重1000#define N 50 /物体总数#define T 800 /最大换代数#define ALIKE 0.05 /判定相似度int stop=0; /初始化函数中初始化为所有价值之和int t=0; /目前的代数int value=220,208,19

10、8,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;int 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

11、,10,10,4,4,2,1;/*数据集三*#define S 5 /种群的规模#define Pc 0.8 /交叉概率#define Pm 0.05 /突变概率#define KW 1000 /背包最大载重1000#define N 60 /物体总数#define T 800 /最大换代数#define ALIKE 0.05 /判定相似度int stop=0; /初始化函数中初始化为所有价值之和int t=0; /目前的代数int value=597,596,593,586,581,568,567,560,549,548,547,529,529,527,520,491,482,478,475

12、,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

13、,22,12,6,250;int weight=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,4

14、3,175,81,5,34,146,148,114,160,174,156,82,47,126,102,83,58,34,21,14;/*/struct individual /个体结构体 bool chromsomeN; /染色体编码 double fitness; /适应度/即本问题中的个体所得价值 double weight; /总重量;int best=0;int same=0;individual XS,YS,bestindividual;/*/int comp(individual bestindividual,individual temp); /比较函数void checkal

15、ike(void); /检查相似度函数void GenerateInitialPopulation(void); /初始种群void CalculateFitnessValue(void); /适应度void SelectionOperator(void); /选择void CrossoverOperator(void); /交叉void MutationOperator(void); /变异void FindBestandWorstIndividual(void); /寻找最优解void srand(unsigned int seed); /随机生成/*/int comp(individua

16、l bestindividual,individual temp)/比较函数 int fit=0,w=0;/第一种不变:操作后不满足重量函数,第二种:操作后适应度小于操作前 for(int i=0;iKW)return -1; return (bestindividual.fitnessfit?-1:1);/如果小于原来值或者不满足重量函数,则返回-1/*/void Checkalike(void) int i=0,j=0; for( i=0;iS;i+)/相似度校验 for(j=0;jN;j+) bool temp=Xi.chromsomej; for(int k=1;kN*ALIKE)/大

17、于ALIKE作为判定为早熟 int minindex=0; for(int n=0;nS;n+) if(Xn.fitnessXminindex.fitness) minindex=n;/确定最小 for (j=0; jN;j+)/重新生成 bool m=(rand()%105)?0:1; Xminindex.chromsomej=m; Xminindex.weight+=m*weightj;/个体的总重量 Xminindex.fitness+=m*valuej; /个体的总价值 /*/void GenerateInitialPopulation(void)/初始种群,保证每个值都在符合条件的解

18、 int i=0,j=0; bool k; for(i=0;iN;i+)stop+=valuei;/设置理论最优值 for (i=0; iS; i+) int w=0,v=0; for (j=0; jN;j+) k=(rand()%10KW) i-; /如果不是解,重新生成 else Xi.fitness=v; Xi.weight=w; if(v=stop) bestindividual=Xi; return; /这种情况一般不会发生 /*/void CalculateFitnessValue() int i=0,j=0; for (i=0; iS; i+) int w=0,v=0; for

19、(j=0; jKW) Xi=bestindividual;/如果不是解,找最好的一个解代之 /*/void SelectionOperator(void) int i, index; double p, sum=0.0; double cfitnessS;/选择、累积概率 individual newXS; for (i=0;iS;i+) sum+=Xi.fitness;/适应度求和 for (i=0;iS; i+) cfitnessi=Xi.fitness/sum; /选择概率 for (i=1;iS; i+) cfitnessi=cfitnessi-1+cfitnessi;/累积概率 fo

20、r (i=0;icfitnessindex)/轮盘赌进行选择 index+; newXi=Xindex; for (i=0; iS; i+) Xi=newXi;/新的种群/*/void CrossoverOperator(void)/交叉操作 int i=0, j=0,k=0;individual temp; for(i=0; iS; i+) int p=0,q=0; do p=rand()%S;/产生两个0,S的随机数 q=rand()%S; while(p=q); int w=1+rand()%N;/1,N表示交换的位数 double r=(rand()%1001)/1000.0;/0,1

21、 if(r=Pc) for(j=0;jw;j+) temp.chromsomej=Xp.chromsomej;/将要交换的位先放入临时空间 Xp.chromsomej=Xq.chromsomej; Xq.chromsomej=temp.chromsomej; if(p=best) if(-1=comp(bestindividual,Xp)/如果变异后适应度变小 Xp=bestindividual; if(q=best) if(-1=comp(bestindividual,Xq)/如果变异后适应度变小 Xq=bestindividual; /*/void MutationOperator(voi

22、d) int i=0, j=0,k=0,q=0; double p=0; for (i=0; iS; i+) for (j=0; jN; j+) p=(rand()%1001)/1000.0; if (pPm)/对每一位都要考虑 if(Xi.chromsomej=1)Xi.chromsomej=0; else Xi.chromsomej=1; if(i=best) if(-1=comp(bestindividual,Xi)/如果变异后适应度变小 Xi=bestindividual; /*/void FindBestandWorstIndividual(void) int i; bestindi

23、vidual=X0; for (i=1;ibestindividual.fitness) bestindividual=Xi; best=i; /*主函数*/int main() DWORD start, stop; start = GetTickCount();/程序开始时间 srand(unsigned)time(0); t=0; GenerateInitialPopulation(); /初始群体包括产生个体和计算个体的初始值 while (t=T) FindBestandWorstIndividual(); /保存当前最优解 SelectionOperator(); /选择 CrossoverOperator(); /交叉 MutationOperator(); /变异 Checkalike(); /检查相似度 Calc

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1