找回密码
 注册
关于网站域名变更的通知
查看: 481|回复: 1
打印 上一主题 下一主题

MATLAB —— 看看遗传算法的程序是怎样的架构

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-10-28 10:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
把这个遗传算法的程序粘过来,即使对我可能没什么用了,但也可能有需要用的人。
' b# M0 C8 Q) N7 V0 G# I$ s7 I# u$ H, D1 q' H3 ]
程序很详细,当时上课的时候就是用这个程序编的一篇小报告。程序很详细。
) T9 i3 v! D; e! A5 d) I
8 W. j7 I2 F7 D, C3 @/ l2 L
  • function main()
  • %% -------------主函数-----------------------------------
  • %                用遗传算法求:
  • %   max: f(x1,x2) = 21.5+x1*sin(4*pi*x1)+x2*sin(20*pi*x2)
  • %        s.t: -3.0 <= x1 <= 12.1
  • %              4.1 <= x2 <= 5.8
  • %---------------------------------------------------------------
  • clear
  • clc
  • close all
  • popsize = 100;     %种群大小
  • x1_length = 18;   %x1长度为18
  • x2_length = 15;   %x2长度为15
  • chromlength = 33;  %二进制编码长度
  • pc = 0.25;          %交叉概率
  • pm = 0.01;        %变异概率
  • pop = initpop(popsize,chromlength);   %初始种群
  • for i = 1:1000 % 迭代1000次
  •     [objvalue] = cal_objvalue(pop);%计算计算函数值
  •     fitvalue = objvalue; %令适应度等于函数值
  •     [newpop] = selection(pop,fitvalue);  %选择操作
  •     [newpop] = crossover(newpop,pc);     %交叉操作
  •     [newpop] = mutation(newpop,pm);      %变异操作
  •     pop = newpop;                %更新种群
  •     % 将种群的每个个体表示出来
  •     [A B] = binary2decimal(newpop);
  •     [y] = cal_objvalue(newpop);
  •     figure(1);
  •     set(1, 'unit', 'normalized', 'position', [0.1,0.1,0.7,0.7]);
  •     if  i<=100&mod(i,10)==0  %每迭代10次做一次图,画100次以内的图
  •         j = floor(i/10);
  •         %画3d图
  •         X = -3.0:0.1:12.1;
  •         Y = 4.1:0.1:5.8;
  •         subplot(2,5,j);
  •         [X, Y] = meshgrid(X,Y);
  •         Z = 21.5 + X.*sin(4*pi*X) + Y.*sin(20*pi*Y);
  •         mesh(X,Y,Z);
  •         hold on;
  •         title(['迭代次数为 n=' num2str(i)]);
  •         plot3(A,B,y,'*');
  •     end
  •     [bestindividual,bestfit]=best(pop,fitvalue);%寻找最优解
  •     [x1 x2] = binary2decimal(bestindividual); %将二进制值转换为十进制
  •     BEST(i) = bestfit;
  •     X1(i) = x1;
  •     X2(i) = x2;
  • end
  •     [max_value,index] = max(BEST');
  •     best_x1 = X1(index);
  •     best_x2 = X2(index);
  •     figure(2);
  •     set(2, 'unit', 'normalized', 'position', [0.1,0.1,0.7,0.7]);
  •     i = 1:1000;
  •     plot(i,BEST);
  •     axis([0,1000,0,40]);
  •     xlabel('进化代数');
  •     ylabel('函数值');
  •     text(100,10,'交叉概率pc = 0.6  变异概率pm = 0.01  进化代数1000次');
  •     text(100,8,['After ',num2str(index),' generations,',...
  •         '  the max value was got.']);
  •     text(100,6,[' x1 = ',num2str(best_x1),'      x2= ',num2str(best_x2),...
  •          '      max value= ', num2str(max_value)]);
  •     fprintf('After %.0f times iterations, max_value was got.\n',index);
  •     fprintf('the best x1 is  --->> %5.2f\n',best_x1);
  •     fprintf('the best x2 is  --->> %5.2f\n',best_x2);
  •     fprintf('the best y is   --->> %5.2f\n',max_value);
  •     fprintf('\n');
  •     fprintf('After %.0f times iterations, final_value was got.\n',1000);
  •     fprintf('the final x1 is  --->> %5.2f\n',x1);
  •     fprintf('the final x2 is  --->> %5.2f\n',x2);
  •     fprintf('the final y is   --->> %5.2f\n',bestfit);
  • function pop = initpop(popsize,chromlength)
  • %% -------------初始化种群函数----------------
  • %    初始化种群大小
  • %       输入变量:
  • %               popsize:种群大小
  • %               chromlength:染色体长度--》转化的二进制长度
  • %       输出变量:
  • %               pop:种群
  • %---------------------------------------
  • pop = round(rand(popsize,chromlength));  %随机产生一个矩阵,每一行是一个长33位染色体;
  • function [pop1 pop2] = binary2decimal(pop)
  • %% -----------解码函数---------------------
  • %    二进制转化为十进制数
  • %    输入变量:
  • %        二进制种群
  • %    输出变量:
  • %        十进制数值
  • %-----------------------------------------
  • for i = 1:18
  •     pop_x1(:,i) = 2.^(18 - i).*pop(:,i);
  • end
  • for j = 1:15
  •     pop_x2(:,j) = 2.^(15 - j).*pop(:,j+18);
  • end
  • %sum(.,2)对行求和,得到列向量
  • temp1 = sum(pop_x1,2);
  • temp2 = sum(pop_x2,2);
  • pop1 = -3.0 + temp1*15.1/(2^18-1); %pop1表示输出x1的十进制数
  • pop2 = 4.1 + temp2*1.7/(2^15-1);  %pop2表示输出的x2的十进制数
  • function [objvalue] = cal_objvalue(pop)
  • %% --------------计算函数值函数----------------------
  • % 计算函数目标值
  • %输入变量:二进制数值
  • %输出变量:目标函数值
  • %---------------------------------------------
  • [x1 x2] = binary2decimal(pop);
  • objvalue = 21.5 + x1.*sin(4*pi*x1) + x2.*sin(20*pi*x2);
  • function [newpop] = selection(pop,fitvalue)
  • %% -----------------根据适应度选择函数-------------------
  • % 输入变量 :pop:二进制种群
  • %           fitvalue: 适应度
  • %输出变量:  newpop: 选择以后的二进制种群
  • % -------------------------------------------
  • %构造轮盘
  • [px,py] = size(pop);
  • totalfit = sum(fitvalue);
  • p_fitvalue = fitvalue/totalfit;
  • p_fitvalue = cumsum(p_fitvalue);%概率求和后排序
  • ms = sort(rand(px,1)); %产生一列随机数,从小到大排列,相当于转转盘10次
  • fitin = 1;
  • newin = 1;
  • while newin <= px
  •     if(ms(newin)) < p_fitvalue(fitin) % 转盘转到 fitin 的位置
  •         newpop(newin,:) = pop(fitin,:); %新种群的第 newin 个体为pop中的第fitin 个体
  •         newin = newin + 1;
  •     else
  •         fitin = fitin +1; %相当于每次都从第一个比较起,依次加1,直至比较完,看转到的是哪一个
  •     end
  • end
  • function [newpop] = crossover(pop,pc)
  • %% ----------交叉函数--------------------
  • % 输入变量:pop:二进制的父代种群数
  • %          pc :交叉概率
  • % 输出变量:newpop: 交叉后的种群数
  • %---------------------------------------
  • [px,py] = size(pop);
  • newpop = ones(size(pop));
  • for i = 1:2:px-1  % 1与2交叉。3与4交叉。。。。。每次隔一个,因此步子为2
  •     if (rand<pc)  % pc = 0.6,即有60%的机会交叉
  •         cpoint = round(rand*py); %交叉点随机选取,互换交叉点以后的值
  •         if cpoint <= 0
  •           % cpoint = 1;
  •           continue;
  •         end
  •         newpop(i,:) = [pop(i,1:cpoint),pop(i+1,cpoint+1:py)];%交叉后的第i个个体
  •         newpop(i+1,:) = [pop(i+1,1:cpoint),pop(i,cpoint+1:py)];
  •     else  % 40%的机会不交叉
  •         newpop(i,:) = pop(i,:);
  •         newpop(i+1,:) = pop(i+1,:);
  •     end
  • end
  • function [newpop] = mutation(pop,pm)
  • %% ------------变异函数---------------------------
  • % 输入变量 pop: 二进制种群
  • %          pm : 变异概率
  • % 输出变量: newpop : 变异以后的种群
  • %-----------------------------------------------
  • [px,py] = size(pop);
  • newpop = ones(size(pop)); %只是起到提前声明的作用,提高运算速度
  • for i = 1:px
  •     if(rand<pm)
  •         mpoint = round(rand*py);
  •         if mpoint<=0
  •             mpoint = 1;
  •         end
  •         newpop(i,:) = pop(i,:);
  •         if newpop(i,mpoint) == 0
  •             newpop(i,mpoint) = 1;
  •         else
  •             newpop(i,mpoint) = 0;
  •         end
  •     else
  •         newpop(i,:) = pop(i,:);
  •     end
  • end
  • function [bestindividual,bestfit] = best(pop,fitvalue)
  • %% --------------选出最优个体函数-----------------------
  • % 输入变量: pop :种群
  • %           fitvalue : 种群适应度
  • % 输出变量: bestindividual : 最佳个体(二进制)
  • % bestfit : 最佳适应度值
  • % ---------------------------------------------
  • [px,py] = size(pop);
  • bestindividual = pop(1,:);
  • bestfit = fitvalue(1);
  • for i = 2:px
  •     if fitvalue(i)>bestfit
  •         bestindividual = pop(i,:);
  •         bestfit = fitvalue(i);
  •     end
  • end
    , \0 n+ k1 a1 ?$ P' h
                  
8 u. |6 K% A9 A5 J# x) @, D4 |
" B1 x9 O9 Z2 a3 o

3 ^9 C, r) a4 ]+ ]3 [
; D1 p6 J' w# G) L3 N( r" ^0 S1 b1 b) {6 ~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-19 13:24 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表