收藏 分销(赏)

遗传算法C语言源代码(一元函数和二元函数).docx

上传人:仙人****88 文档编号:8784007 上传时间:2025-03-02 格式:DOCX 页数:15 大小:20.56KB 下载积分:10 金币
下载 相关 举报
遗传算法C语言源代码(一元函数和二元函数).docx_第1页
第1页 / 共15页
遗传算法C语言源代码(一元函数和二元函数).docx_第2页
第2页 / 共15页


点击查看更多>>
资源描述
C语言遗传算法代码 以下为遗传算法的源代码,计算一元代函数的代码和二元函数的代码以+++++++++++++++++++++++++++++++++++++为分割线分割开来,请自行选择适合的代码,使用时请略看完代码的注释,在需要更改的地方更改为自己需要的代码。 +++++++++++++++++++++++++++++++一元函数代码++++++++++++++++++++++++++++ #include <stdio.h> #include<stdlib.h> #include<time.h> #include<math.h> #define POPSIZE 1000 #define maximization 1 #define minimization 2 #define cmax 100 #define cmin 0 #define length1 20 #define chromlength length1 //染色体长度 //注意,你是求最大值还是求最小值 int functionmode=minimization; //变量的上下限的修改开始 float min_x1=-2;//变量的下界 float max_x1=-1;//变量的上界 //变量的上下限的修改结束 int popsize; //种群大小 int maxgeneration; //最大世代数 double pc; //交叉率 double pm; //变异率 struct individual { char chrom[chromlength+1]; double value; double fitness; //适应度 }; int generation; //世代数 int best_index; int worst_index; struct individual bestindividual; //最佳个体 struct individual worstindividual; //最差个体 struct individual currentbest; struct individual population[POPSIZE]; //函数声明 void generateinitialpopulation(); void generatenextpopulation(); void evaluatepopulation(); long decodechromosome(char *,int,int); void calculateobjectvalue(); void calculatefitnessvalue(); void findbestandworstindividual(); void performevolution(); void selectoperator(); void crossoveroperator(); void mutationoperator(); void input(); void outputtextreport(); void generateinitialpopulation( ) //种群初始化 { int i,j; for (i=0;i<popsize; i++) { for(j=0;j<chromlength;j++) { population[i].chrom[j]=(rand()%20<10)?'0':'1'; } population[i].chrom[chromlength]='\0'; } } void generatenextpopulation() //生成下一代 { selectoperator(); crossoveroperator(); mutationoperator(); } void evaluatepopulation() //评价个体,求最佳个体 { calculateobjectvalue(); calculatefitnessvalue(); findbestandworstindividual(); } long decodechromosome(char *string ,int point,int length) //给染色体解码 { int i; long decimal=0; char*pointer; for(i=0,pointer=string+point;i<length;i++,pointer++) if(*pointer-'0') {decimal +=(long)pow(2,i); } return (decimal); } void calculateobjectvalue() //计算函数值 { int i; long temp1,temp2; double x1; for (i=0; i<popsize; i++) { temp1=decodechromosome(population[i].chrom,0,length1); x1=(max_x1-min_x1)*temp1/(1024*1024-1)+min_x1; //目标函数修改开始 population[i].value=(pow(x1,5)-3*x1-1)*(pow(x1,5)-3*x1-1); //目标函数修改结束 } } void calculatefitnessvalue()//计算适应度 { int i; double temp; for(i=0;i<popsize;i++) { if(functionmode==maximization) {if((population[i].value+cmin)>0.0) {temp=cmin+population[i].value;} else {temp=0.0; } } else if (functionmode==minimization) { if(population[i].value<cmax) {temp=cmax-population[i].value;} else{ temp=0.0;} } population[i].fitness=temp; } } void findbestandworstindividual( ) //求最佳个体和最差个体 { int i; double sum=0.0; bestindividual=population[0]; worstindividual=population[0]; for (i=1;i<popsize; i++){ if (population[i].fitness>bestindividual.fitness){ bestindividual=population[i]; best_index=i; } else if (population[i].fitness<worstindividual.fitness) { worstindividual=population[i]; worst_index=i; } sum+=population[i].fitness; } if (generation==0){ currentbest=bestindividual; } else{ if(bestindividual.fitness>=currentbest.fitness){ currentbest=bestindividual; } } } void performevolution() //演示评价结果 { if (bestindividual.fitness>currentbest.fitness){ currentbest=population[best_index]; } else{ population[worst_index]=currentbest; } } void selectoperator() //比例选择算法 { int i,index; double p,sum=0.0; double cfitness[POPSIZE]; struct individual newpopulation[POPSIZE]; for(i=0;i<popsize;i++) {sum+=population[i].fitness;} for(i=0;i<popsize; i++){ cfitness[i]=population[i].fitness/sum; } for(i=1;i<popsize; i++){ cfitness[i]=cfitness[i-1]+cfitness[i]; } for (i=0;i<popsize;i++) { p=rand()%1000/1000.0; index=0; while (p>cfitness[index]) { index++; } newpopulation[i]=population[index]; } for(i=0;i<popsize; i++){ population[i]=newpopulation[i]; } } void crossoveroperator() //交叉算法 { int i,j; int index[POPSIZE]; int point,temp; double p; char ch; for (i=0;i<popsize;i++){ index[i]=i; } for (i=0;i<popsize;i++){ point=rand()%(popsize-i); temp=index[i]; index[i]=index[point+i]; index[point+i]=temp; } for (i=0;i<popsize-1;i+=2){ p=rand()%1000/1000.0; if (p<pc){ point=rand()%(chromlength-1)+1; for (j=point; j<chromlength;j++){ ch=population[index[i]].chrom[j]; population[index[i]].chrom[j]=population[index[i+1]].chrom[j]; population[index[i+1]].chrom[j]=ch; } } } } void mutationoperator() //变异操作 { int i,j; double p; for (i=0;i<popsize;i++){ for(j=0;j<chromlength;j++){ p=rand()%1000/1000.0; if (p<pm){ population[i].chrom[j]=(population[i].chrom[j]=='0')?'1':'0'; } } } } void input() //数据输入 { //printf("初始化全局变量:\n"); //printf(" 种群大小(50-500):"); //scanf("%d", &popsize); popsize=500; if((popsize%2) != 0) { //printf( " 种群大小已设置为偶数\n"); popsize++;}; //printf(" 最大世代数(100-300):"); //scanf("%d", &maxgeneration); maxgeneration=200; //printf(" 交叉率(0.2-0.99):"); //scanf("%f", &pc); pc=0.95; //printf(" 变异率(0.001-0.1):"); //scanf("%f", &pm); pm=0.03; } void outputtextreport()//数据输出 { int i; double sum; double average; sum=0.0; for(i=0;i<popsize;i++) {sum+=population[i].value;} average=sum/popsize; printf("当前世代=%d\n当前世代平均函数值=%f\n当前世代最优函数值=%f\n",generation,average,population[best_index].value); } void main() //主函数 { int i; long temp1,temp2; double x1,x2; generation=0; input(); generateinitialpopulation(); evaluatepopulation(); while(generation<maxgeneration) { generation++; generatenextpopulation(); evaluatepopulation(); performevolution(); outputtextreport(); } printf("\n"); printf(" 统计结果: "); printf("\n"); //printf("最大函数值等于:%f\n",currentbest.fitness); printf("其染色体编码为:"); for (i=0;i<chromlength;i++) { printf("%c",currentbest.chrom[i]); } printf("\n"); temp1=decodechromosome(currentbest.chrom,0,length1); x1=(max_x1-min_x1)*temp1/(1024*1024-1)+min_x1; printf("x1=%lf\n",x1); //这是需要修改的地方 printf("最优值等于:%f\n",(pow(x1,5)-3*x1-1)*(pow(x1,5)-3*x1-1)); } +++++++++++++++++++++++++二元函数代码+++++++++++++++++++++++++++++++++++++++++ #include <stdio.h> #include<stdlib.h> #include<time.h> #include<math.h> #define POPSIZE 500 #define maximization 1 #define minimization 2 #define cmax 100 #define cmin 0 #define length1 20 #define length2 20 #define chromlength length1+length2 //染色体长度 //-----------求最大还是最小值 int functionmode=maximization; //----------- //-----------变量上下界 float min_x1=0; float max_x1=3; float min_x2=1; float max_x2=5; //----------- int popsize; //种群大小 int maxgeneration; //最大世代数 double pc; //交叉率 double pm; //变异率 struct individual { char chrom[chromlength+1]; double value; double fitness; //适应度 }; int generation; //世代数 int best_index; int worst_index; struct individual bestindividual; //最佳个体 struct individual worstindividual; //最差个体 struct individual currentbest; struct individual population[POPSIZE]; //函数声明 void generateinitialpopulation(); void generatenextpopulation(); void evaluatepopulation(); long decodechromosome(char *,int,int); void calculateobjectvalue(); void calculatefitnessvalue(); void findbestandworstindividual(); void performevolution(); void selectoperator(); void crossoveroperator(); void mutationoperator(); void input(); void outputtextreport(); void generateinitialpopulation( ) //种群初始化 { int i,j; for (i=0;i<popsize; i++) { for(j=0;j<chromlength;j++) { population[i].chrom[j]=(rand()%40<20)?'0':'1'; } population[i].chrom[chromlength]='\0'; } } void generatenextpopulation() //生成下一代 { selectoperator(); crossoveroperator(); mutationoperator(); } void evaluatepopulation() //评价个体,求最佳个体 { calculateobjectvalue(); calculatefitnessvalue(); findbestandworstindividual(); } long decodechromosome(char *string ,int point,int length) //给染色体解码 { int i; long decimal=0; char*pointer; for(i=0,pointer=string+point;i<length;i++,pointer++) if(*pointer-'0') {decimal +=(long)pow(2,i); } return (decimal); } void calculateobjectvalue() //计算函数值 { int i; long temp1,temp2; double x1,x2; for (i=0; i<popsize; i++) { temp1=decodechromosome(population[i].chrom,0,length1); temp2=decodechromosome(population[i].chrom,length1,length2); x1=(max_x1-min_x1)*temp1/(1024*1024-1)+min_x1; x2=(max_x2-min_x2)*temp2/(1024*1024-1)+min_x2; //-----------函数 population[i].value=x1*x1+sin(x1*x2)-x2*x2; //----------- } } void calculatefitnessvalue()//计算适应度 { int i; double temp; for(i=0;i<popsize;i++) { if(functionmode==maximization) {if((population[i].value+cmin)>0.0) {temp=cmin+population[i].value;} else {temp=0.0; } } else if (functionmode==minimization) { if(population[i].value<cmax) {temp=cmax-population[i].value;} else{ temp=0.0;} } population[i].fitness=temp; } } void findbestandworstindividual( ) //求最佳个体和最差个体 { int i; double sum=0.0; bestindividual=population[0]; worstindividual=population[0]; for (i=1;i<popsize; i++){ if (population[i].fitness>bestindividual.fitness){ bestindividual=population[i]; best_index=i; } else if (population[i].fitness<worstindividual.fitness) { worstindividual=population[i]; worst_index=i; } sum+=population[i].fitness; } if (generation==0){ currentbest=bestindividual; } else{ if(bestindividual.fitness>=currentbest.fitness){ currentbest=bestindividual; } } } void performevolution() //演示评价结果 { if (bestindividual.fitness>currentbest.fitness){ currentbest=population[best_index]; } else{ population[worst_index]=currentbest; } } void selectoperator() //比例选择算法 { int i,index; double p,sum=0.0; double cfitness[POPSIZE]; struct individual newpopulation[POPSIZE]; for(i=0;i<popsize;i++) {sum+=population[i].fitness;} for(i=0;i<popsize; i++){ cfitness[i]=population[i].fitness/sum; } for(i=1;i<popsize; i++){ cfitness[i]=cfitness[i-1]+cfitness[i]; } for (i=0;i<popsize;i++) { p=rand()%1000/1000.0; index=0; while (p>cfitness[index]) { index++; } newpopulation[i]=population[index]; } for(i=0;i<popsize; i++){ population[i]=newpopulation[i]; } } void crossoveroperator() //交叉算法 { int i,j; int index[POPSIZE]; int point,temp; double p; char ch; for (i=0;i<popsize;i++){ index[i]=i; } for (i=0;i<popsize;i++){ point=rand()%(popsize-i); temp=index[i]; index[i]=index[point+i]; index[point+i]=temp; } for (i=0;i<popsize-1;i+=2){ p=rand()%1000/1000.0; if (p<pc){ point=rand()%(chromlength-1)+1; for (j=point; j<chromlength;j++){ ch=population[index[i]].chrom[j]; population[index[i]].chrom[j]=population[index[i+1]].chrom[j]; population[index[i+1]].chrom[j]=ch; } } } } void mutationoperator() //变异操作 { int i,j; double p; for (i=0;i<popsize;i++){ for(j=0;j<chromlength;j++){ p=rand()%1000/1000.0; if (p<pm){ population[i].chrom[j]=(population[i].chrom[j]=='0')?'1':'0'; } } } } void input() //数据输入 { //printf("初始化全局变量:\n"); //printf(" 种群大小(50-500):"); //scanf("%d", &popsize); popsize=200; if((popsize%2) != 0) { //printf( " 种群大小已设置为偶数\n"); popsize++;}; //printf(" 最大世代数(100-300):"); //scanf("%d", &maxgeneration); maxgeneration=200; //printf(" 交叉率(0.2-0.99):"); //scanf("%f", &pc); pc=0.9; //printf(" 变异率(0.001-0.1):"); //scanf("%f", &pm); pm=0.003; } void outputtextreport()//数据输出 { int i; double sum; double average; sum=0.0; for(i=0;i<popsize;i++) {sum+=population[i].value;} average=sum/popsize; printf("当前世代=%d\n当前世代平均函数值=%f\n当前世代最优函数值=%f\n",generation,average,population[best_index].value); } void main() //主函数 { int i; long temp1,temp2; double x1,x2; generation=0; input(); generateinitialpopulation(); evaluatepopulation(); while(generation<maxgeneration) { generation++; generatenextpopulation(); evaluatepopulation(); performevolution(); outputtextreport(); } printf("\n"); printf(" 统计结果: "); printf("\n"); //printf("最大函数值等于:%f\n",currentbest.fitness); printf("其染色体编码为:"); for (i=0;i<chromlength;i++) { printf("%c",currentbest.chrom[i]); } printf("\n"); temp1=decodechromosome(currentbest.chrom,0,length1); temp2=decodechromosome(currentbest.chrom,length1,length2); x1=(max_x1-min_x1)*temp1/(1024*1024-1)+min_x1; x2=(max_x2-min_x2)*temp2/(1024*1024-1)+min_x2; printf("x=%lf,y=%lf\n",x1,x2); //-----------修改函数 printf("最大值=%f\n",x1*x1+sin(x1*x2)-x2*x2); //----------- }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 小学其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服