?? adapticepm_sga_mutation.m
字號:
% 2.6 變異
%遺傳算法子程序
%Name: mutation.m
%變異
function [newpop]=adapticePM_sga_mutation(popsize,chromlength,pop,fitvalue,up_range)
%函數(shù)說明
%入口參數(shù):pop 當(dāng)前處理的種群,
% fitvalue 適應(yīng)度值數(shù)組
% popsize 種群大小,
% chromlength 基因位長度,
% up_range 自變量的相對上限,
%出口參數(shù):newpop 準(zhǔn)子代,
%功能說明:% 變異(mutation),基因的突變普遍存在于生物的進(jìn)化過程中。變異是指父代中的每個個體的每一位都以概率 pm 翻轉(zhuǎn),即由“1”變?yōu)椤?”,
% 或由“0”變?yōu)椤?”。遺傳算法的變異特性可以使求解過程隨機(jī)地搜索到解可能存在的整個空間,因此可以在一定程度上求得全局最優(yōu)解。
% 其中pm 由適應(yīng)度值計(jì)算得到
% if fitvalue(i)>=fitvalue_ave
% pm=0.5*(fitvalue_max-fitvalue(i))/(fitvalue_max-fitvalue_ave);
% else
% pm=0.5;
% end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% popsize=10;
% pop=[1023,980,2133,726,1946,657,1702,1224,1522,807;
% 2025,2565,1773,2340,2354,1144,2061,240,1573,825]
% chromlength=12;
% pm=0.7;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
pop1=pop(1,:); %將種群矩陣拆分
pop1;
pop2=pop(2,:);
pop2;
pop1=dec2bin(pop1,chromlength); %%各自轉(zhuǎn)為二進(jìn)制
pop1;
pop2=dec2bin(pop2,chromlength);
pop2;
newpop1=pop1;
newpop2=pop2;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 計(jì)算最大的 適應(yīng)值和適應(yīng)值平均
fitvalue_max=max(fitvalue);
fitvalue_ave=mean(fitvalue);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:popsize;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 計(jì)算變異概率pm
if fitvalue(i)>=fitvalue_ave
pm=0.5*(fitvalue_max-fitvalue(i))/(fitvalue_max-fitvalue_ave);
else
pm=0.5;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if(rand<pm) %產(chǎn)生一隨機(jī)數(shù)與變異概率比較
mpoint=round(rand*chromlength);
% mpoint
if mpoint<=0
mpoint=1;
end
if newpop1(i,mpoint)=='0'
newpop1(i,mpoint)='1';
else
newpop1(i,mpoint)='0';
end
end
if(rand<pm) %產(chǎn)生一隨機(jī)數(shù)與變異概率比較
mpoint=round(rand*chromlength);
% mpoint
if mpoint<=0
mpoint=1;
end
if newpop2(i,mpoint)=='0'
newpop2(i,mpoint)='1';
else
newpop2(i,mpoint)='0';
end
end
end
newpop1=bin2dec(newpop1);
newpop2=bin2dec(newpop2);
for i=1:popsize
if newpop1(i)>=up_range
% pop_init=randperm(20000);
% newpop1(i)=newpop1(i)-3095;
newpop1(i)=rand;
end
if newpop2(i)>=up_range
% newpop2(i)=newpop2(i)-3095;
% pop_init=randperm(20000);
newpop2(i)=rand;
end
end
newpop(1,:)=newpop1';
newpop(2,:)=newpop2';
newpop;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -