📄 mutation.m
字号:
function ret=Mutation(pmutation,lenchrom,chrom,sizepop,opts,pop,fcode,bound)
% 本函数完成变异操作
% pcorss input : 变异概率
% lenchrom input : 染色体长度
% chrom input : 染色体群
% sizepop input : 种群规模
% opts input : 变异方法的选择
% pop input : 当前种群的进化代数和最大的进化代数信息
% ret output : 变异后的染色体
switch opts
case 'simple' % 单点法变异
for i=1:sizepop %每一轮for循环中,可能会进行一次变异操作,染色体是随机选择的,变异位置也是随机选择的,
%但该轮for循环中是否进行变异操作则由变异概率决定(continue控制)
% 随机选择一个染色体进行变异
pick=rand;
while pick==0
pick=rand;
end
index=ceil(pick*sizepop); %随机选择一个染色体进行变异
% 变异概率决定该轮循环是否进行变异
pick=rand;
if pick>pmutation
continue; %如果pick大于变异概率,则跳出该轮for循环,不进行以下的变异操作
end
flag=0;
while flag==0
% 变异位置
pick=rand; %随机选择一个要变异的位置,变异开始
while pick==0
pick=rand;
end
pos=ceil(pick*sum(lenchrom));
v=bitget(chrom(index,:),pos);
v=~v;
chrom(index,:)=bitset(chrom(index,:),pos,v); %变异结束
flag=test(lenchrom,bound,chrom(index,:),fcode); %检验染色体的可行性
end
end
ret=chrom;
case 'float' % 浮点法变异
for i=1:sizepop %每一轮for循环中,可能会进行一次变异操作,染色体是随机选择的,变异位置也是随机选择的,
%但该轮for循环中是否进行变异操作则由变异概率决定(continue控制)
% 随机选择一个染色体进行变异
pick=rand;
while pick==0
pick=rand;
end
index=ceil(pick*sizepop);
% 变异概率决定该轮循环是否进行变异
pick=rand;
if pick>pmutation
continue;
end
flag=0;
while flag==0
% 变异位置
pick=rand;
while pick==0
pick=rand;
end
pos=ceil(pick*sum(lenchrom)); %随机选择了染色体变异的位置,即选择了第pos个变量进行变异
v=chrom(i,pos);
v1=v-bound(pos,1);
v2=bound(pos,2)-v;
pick=rand; %变异开始
if pick>0.5
delta=v2*(1-pick^((1-pop(1)/pop(2))^2));
chrom(i,pos)=v+delta;
else
delta=v1*(1-pick^((1-pop(1)/pop(2))^2));
chrom(i,pos)=v-delta;
end %变异结束
flag=test(lenchrom,bound,chrom(i,:),fcode); %检验染色体的可行性
end
end
ret=chrom;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -