📄 mutation.m
字号:
function Mpop=mutation(cpop,nxm,u,varnum,pm,lpm,dis,pass,obj,limit)
moutm=zeros(pass(1),pass(4));
for rm=1:pass(1)
moutm(rm,:)=simu(nxm,cpop(rm,1),cpop(rm,2),u,pass(2),pass(3));
qm(rm,:)=(moutm(rm,:)-obj).^2;
Qm(rm)=sum(abs(qm(rm,:)))*100;
end
[mq,numm]=sort(Qm); % 按照从小到大排序
for im=1:pass(1) % 重新排列种群
for jm=1:varnum
cpop(im,jm)=cpop(numm(im),jm);
end
Qmn(im)=Qm(numm(im));
end
Pm_rand=rand(pass(1),varnum);
temp1=zeros(pass(1),varnum);
for rm=3:8
for km=1:varnum
if Pm_rand(rm,km)<pm(1)
tempm(1,km)=cpop(rm,km)+lpm(1)*(rand(1)-0.5)*dis(km);
else
tempm(1,km)=cpop(rm,km);
end
end
for km=1:varnum
if tempm(1,km)<limit(km,1)|tempm(1,km)>limit(km,2)
tempm(1,:)=0;
break;
end
end
tempm(2,:)=cpop(rm,:);
moutm1=zeros(1,pass(4));
% for jm=1:2
if tempm(1,1)==0|tempm(1,2)==0
Qm1(1)=100;
Qm1(2)=Qmn(rm);
% break;
else
moutm1(1,:)=simu(nxm,tempm(1,1),tempm(1,2),u,pass(2),pass(3));
qm1(1,:)=(moutm1(1,:)-obj).^2;
Qm1(1)=sum(qm1(1,:))*100;
Qm1(2)=Qmn(rm);
end
% moutm1(jm,:)=simu(nxm,tempm(jm,1),tempm(jm,2),u,pass(2),pass(3));
% qm1(jm,:)=(moutm1(jm,:)-obj).^2;
% Qm1(jm)=sum(abs(qm1(jm,:)))*100;
% end
[Qmmi,Im]=min(Qm1);
if Qmmi==100
'变异程序出错'
break;
else
temp1(rm,:)=tempm(Im,:);
end
% temp1(rm,:)=tempm(Im,:);
end
for rm=9:14
for km=1:varnum
if Pm_rand(rm,km)<pm(2)
tempm(1,km)=cpop(rm,km)+lpm(2)*(rand(1)-0.5)*dis(km);
else
tempm(1,km)=cpop(rm,km);
end
end
for km=1:varnum
if tempm(1,km)<limit(km,1)|tempm(1,km)>limit(km,2)
tempm(1,:)=0;
break;
end
end
tempm(2,:)=cpop(rm,:);
moutm1=zeros(1,pass(4));
% for jm=1:2
if tempm(1,1)==0|tempm(1,2)==0
Qm1(1)=100;
Qm1(2)=Qmn(rm);
else
moutm1(1,:)=simu(nxm,tempm(1,1),tempm(1,2),u,pass(2),pass(3));
qm1(1,:)=(moutm1(1,:)-obj).^2;
Qm1(1)=sum(qm1(1,:))*100;
Qm1(2)=Qmn(rm);
end
% end
[Qmmi,Im]=min(Qm1);
if Qmmi==100
'变异程序出错'
break;
else
temp1(rm,:)=tempm(Im,:);
end
% temp1(rm,:)=tempm(Im,:);
end
for rm=15:20
for km=1:varnum
if Pm_rand(rm,km)<pm(3)
tempm(1,km)=cpop(rm,km)+lpm(3)*(rand(1)-0.5)*dis(km);
else
tempm(1,km)=cpop(rm,km);
end
end
for km=1:varnum
if tempm(1,km)<limit(km,1)|tempm(1,km)>limit(km,2)
tempm(1,:)=0;
break;
end
end
tempm(2,:)=cpop(rm,:);
moutm1=zeros(1,pass(4));
% for jm=1:2
if tempm(1,1)==0|tempm(1,2)==0
Qm1(1)=100;
Qm1(2)=Qmn(rm);
else
moutm1(1,:)=simu(nxm,tempm(1,1),tempm(1,2),u,pass(2),pass(3));
qm1(1,:)=(moutm1(1,:)-obj).^2;
Qm1(1)=sum(qm1(1,:))*100;
Qm1(2)=Qmn(rm);
end
% if tempm(jm,1)==0|tempm(jm,2)==0
% Qm1=100;
% break;
% end
% moutm1(jm,:)=simu(nxm,tempm(jm,1),tempm(jm,2),u,pass(2),pass(3));
% qm1(jm,:)=(moutm1(jm,:)-obj).^2;
% Qm1(jm)=sum(abs(qm1(jm,:)))*100;
% end
[Qmmi,Im]=min(Qm1);
if Qmmi==100
'变异程序出错'
break;
else
temp1(rm,:)=tempm(Im,:);
end
% temp1(rm,:)=tempm(Im,:);
end
for rm=1:2
Mpop(rm,:)=cpop(rm,:);
end
for rm=3:pass(1)
Mpop(rm,:)=temp1(rm,:);
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -