遗传算法自学笔记4

读懂怎么操作(绿色表示新的标注)

%% -------------主函数-----------------------------------
%                用遗传算法求:
%   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);     %交叉操作

————————————————
版权声明:本文为CSDN博主「李锐博恩」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Reborn_Lee/article/details/82913414

function [newpop] = crossover(pop,pc)
%% ----------交叉函数--------------------
% 输入变量:pop:二进制的父代种群数
%          pc :交叉概率
% 输出变量:newpop: 交叉后的种群数
%---------------------------------------

[px,py] = size(pop);  %取pop矩阵的行与列给px,py。
newpop = ones(size(pop));%newpop=矩阵pop内元素都为1。
for i = 1:2:px-1  % 1与2交叉。3与4交叉。。。。。每次隔一个,因此步子为2(扩展i=a:b:c,即从a开始,步进为b,到截止。)
    if (rand<pc)  % pc = 0.6,即有60%的机会交叉,单独rand即随机小数,小数点后4位。
        cpoint = round(rand*py); %交叉点随机选取,互换交叉点以后的值,即0-33位。
        if cpoint <= 0     % cpoint = 1;
         continue;
        end
        newpop(i,:) = [pop(i,1:cpoint),pop(i+1,cpoint+1:py)];%交叉后的第i个个体,newpop(a,:)表示第a行的元素。
        newpop(i+1,:) = [pop(i+1,1:cpoint),pop(i,cpoint+1:py)];%交叉后的第i+1个个体,pop(a,b:c)表示,第a行的从b位开始到c位结束,上面两行完成交叉的操作。
    else  % 40%的机会不交叉
        newpop(i,:) = pop(i,:);
        newpop(i+1,:) = pop(i+1,:);
    end
end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值