% 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的变异。
整个变异把所有情况考虑全,没有遗漏。