遗传算法自学笔记5

%   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;                %更新种群

function [newpop] = mutation(pop,pm)
%% ------------变异函数---------------------------
% 输入变量 pop: 二进制种群
%          pm : 变异概率
% 输出变量: newpop : 变异以后的种群
%-----------------------------------------------
[px,py] = size(pop);
newpop = ones(size(pop)); %只是起到提前声明的作用,提高运算速度
for i = 1:px
    if(rand<pm)  %if语句,rand随机小数。
        mpoint = round(rand*py);%产生一个0-py的随机数
        if mpoint<=0%3、第i,mppoint位进行突变,由0变为1或者由1变为0;
            mpoint = 1;
        end

        newpop(i,:) = pop(i,:);
        if newpop(i,mpoint) == 0%2、第i,mppoint位进行突变,由0变为1或者由1变为0;
            newpop(i,mpoint) = 1;
        else
            newpop(i,mpoint) = 0;
        end
    else
        newpop(i,:) = pop(i,:);%1、保持原来的值,不变异
    end
end
————————————————
版权声明:本文为CSDN博主「李锐博恩」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Reborn_Lee/article/details/82913414

嵌套if-else语句,由外向里看:

第一层1、如果rand随机数<pm,变异概率就进入变异程序。其他的保持原来的值,不变异;

第二层2、如果mpoint=0,则条件句为真,mpoint=1,完成0到1的变异;反之,则mpoint=0,完成1到0的变异。

第二层3、如果mpoint=0时,即rand=0,则mpoint=1,完成0到1的变异。

整个变异把所有情况考虑全,没有遗漏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值