📄 sd22.m
字号:
clear all;
clc;
format short;
Pnumber=192;
opt=zeros(1,3);
maxc=5;
qo=zeros(1,288);
Population_number=20;
Emigration_generation=3;
Emigration_number=Population_number;
pc=0.7;
pm=0.15;
cc(1,:)=[20 24 25 22 23 28 23 24 25 27 20 26 20 28 24 26 21 23 19 22 23 23 21 22 24 26 24 27 25 21 24 21 23 22 22 24 26 27 28 24 21 20 22 25 24 26 24 25 24 21 20 23 22 22 22 22 23 22 24 25 27 21 26 28 24 25 24 24 27 27 29 23 24 25 21 24 21 23 26 25 19 28 24 26 27 27 29 22 24 18 23 24 26 25 26 27];
cc(2,:)=[4 3 2 3 4 3 2 3 4 3 2 3 4 3 2 1 2 2 3 4 2 3 5 3 2 1 2 2 4 3 1 2 4 3 2 3 4 3 3 2 1 3 3 4 2 1 2 3 3 2 3 4 4 3 1 1 3 2 1 2 3 3 4 3 2 2 1 2 3 4 3 2 1 2 3 3 2 4 2 3 4 2 3 2 1 2 3 4 3 3 4 2 2 3 3 4];
cc(3,:)=[2 1 2 3 3 4 3 2 2 1 2 3 4 3 2 1 2 3 3 2 4 2 3 4 2 3 2 1 2 3 4 3 3 4 2 2 3 3 4 4 3 2 3 4 3 2 3 4 3 2 3 4 3 2 1 2 2 3 4 2 3 4 3 2 1 2 2 4 3 1 2 4 3 2 3 4 3 3 2 1 3 3 4 2 1 2 3 3 2 3 4 4 3 1 1 3];
v10=1000000;
v20=80000;
v30=50000;
hhh=36.9919+0.0007061*v30-2.3679*10^(-12)*v30^2+2.1528*10^(-15)*v30^3;
hh=5.2975+0.002023802*v20-1.760249*10^(-8)*v20^2+6.4832*10^(-14)*v20^3;
p(1:96)=[2213.182 2248.814 1951.312 1698.104 1116.228 1029.144 1005.312 1019.088 1017.408 1020.768 1021.104 1032.192 1023.12 1000.272 1014.048 1011.696 999.6 1013.376 1015.392 1021.776 1037.232 1046.304 1039.584 1038.912 1039.248 1037.568 1081.14 1418.366 1680.136 1730.278 1872.286 2192.83 2566.202 3185.16 3414.376 3917.122 3911.432 4442.352 4373.522 4485.124 4524.184 4585.402 4421.82 4446.464 4463.276 4513.4 4433.202 4631.592 4441.916 4248.732 4246.436 4119.032 4166.74 4298.232 4275.5 4375.492 4437.34 4488.23 4484.714 4482.696 4427.826 4419.074 4443.042 4407.496 3899.074 3928.91 4121.99 4291.738 4356.966 4390.434 4029.394 4058.2 3921.746 3764.098 3503.244 3605.764 4065.02 4571.61 4655.234 4712.454 4721.958 4814.112 4817.884 4798.02 4697.89 4647.854 3962.894 3965.158 3533.862 3117.786 3057.966 3088.324 3285.392 2663.634 1454.554 1249.32];
pp=0;
for jj=1:96
pp=pp+p(jj);
end
nnn=10.9218;
q(1,193:200)=[121 103 99 101 113 73 24 21];
q(2,195:200)=[53 53 53 53 53 53];
opt(1:3)=[0 0 0];
qmax1=227.8;
qmax2=60.3;
qmax3=56.7;
qmin1=5;
qmin2=6;
qmin3=5;
vmax1=1455700;
vmax2=106000;
vmax3=93000;
vmin1=466200;
vmin2=66300;
vmin3=37000;
%parameters setting
Population_size=700;
String_Length=1920;
elitist=1;
%ending condition setting
max_generation=150;
max_nonincrease_generation=300;
fo=zeros(maxc,max_generation);
%course parameters checkout
c=Population_size/Population_number;
c=fix(c);
if c<Population_size/Population_number
Population_size=Population_number*round(Population_size/Population_number);
end
c=Emigration_number/Population_number;
c=fix(c);
if c<Emigration_number/Population_number
Emigration_number=Population_number*(fix(Emigration_number/Population_number)+1);
end
%course outcomes setting
Subpopulation_size=Population_size/Population_number;
Subemigration_number=Emigration_number/Population_number;
optimal=zeros(maxc,2);
for rr=1:maxc
%outcomes setting
if rr>2
Population_number=1;
end
generation=1;
optimal_now=zeros(max_generation,Population_number);
maxsat=0;
%compute times Initialization
fitness_computetime=0;
chromosome_computetime=0;
%Initialization
for k=1:Population_number
for i=1:Population_size
for iii=1:Pnumber
tt=clock;
c=tt(6)/60;
c=rand(1);
for j=1:String_Length/Pnumber
c=2*c;
chromosome(k,i,String_Length/Pnumber*iii-String_Length/Pnumber+j)=fix(c);
c=rem(c,1);
end
end
end
end
fitness_function=zeros(Population_number,Subpopulation_size);
selected=zeros(Population_number,1,Population_size);
chromosome_change=zeros(Population_number,Population_size,String_Length);
%main
while 1
for k=1:Population_number
maxsat_now=0;
sum_fit=0;
for i=1:Subpopulation_size
%encode
for jj=1:Pnumber
a(jj,1:String_Length/Pnumber)=chromosome(k,i,((jj-1)*(String_Length/Pnumber)+1):jj*(String_Length/Pnumber));
end
for jj=1:Pnumber
param(jj)=0;
end
for jj=1:Pnumber/2
for j=1:String_Length/Pnumber
param(jj)=param(jj)+a(jj,j)*(2^(j-1));
end
m=2^(String_Length/Pnumber)-1;
if param(jj)<1
q(3,jj)=qmin3;
else
q(3,jj)=(qmax3-qmin3)*param(jj)/m+qmin3;
end
end
for jj=(1+Pnumber/2):Pnumber
for j=1:String_Length/Pnumber
param(jj)=param(jj)+a(jj,j)*(2^(j-1));
end
m=2^(String_Length/Pnumber)-1;
if param(jj)<1
q(2,jj-Pnumber/2)=qmin2;
else
q(2,jj-Pnumber/2)=(qmax2-qmin2)*param(jj)/m+qmin2;
end
end
chromosome_computetime=chromosome_computetime+1;
for jj=1:Pnumber/2
if jj==1
q(1,jj)=(p(jj)*nnn-hhh*q(3,jj)-hh*q(2,jj))/(64.6+0.000311319*v10-2.0832*10^(-10)*v10^2+5.4337*10^(-17)*v10^3);
else
q(1,jj)=(p(jj)*nnn-(36.9919+0.0007061*v(3,jj-1)-2.3679*10^(-12)*v(3,jj-1)^2+2.1528*10^(-15)*v(3,jj-1)^3)*q(3,jj)-(5.2975+0.002023802*v(2,jj-1)-1.760249*10^(-8)*v(2,jj-1)^2+6.4832*10^(-14)*v(2,jj-1)^3)*q(2,jj))/(64.6+0.000311319*v(1,jj-1)-2.0832*10^(-10)*v(1,jj-1)^2+5.4337*10^(-17)*v(1,jj-1)^3);
end
if q(1,jj)<qmin1
q(1,jj)=2*qmin1-q(1,jj);
elseif (q(1,jj)>qmax1)
q(1,jj)=q(1,jj)+qmax1;
end
if jj==1
v(1,jj)=v10-q(1,jj)+cc(1,jj);
v(2,jj)=v20-q(2,jj)+q(1,jj+192)+cc(2,jj);
v(3,jj)=v30-q(3,jj)+q(2,jj+194)+cc(3,jj);
else
v(1,jj)=v(1,jj-1)-q(1,jj)+cc(1,jj);
v(2,jj)=v(2,jj-1)-q(2,jj)+q(1,jj+192)+cc(2,jj);
v(3,jj)=v(3,jj-1)-q(3,jj)+q(2,jj+194)+cc(3,jj);
end
if (v(1,jj)<vmin1) | (v(1,jj)>vmax1) | (v(2,jj)<vmin2) | (v(2,jj)>vmax2) | (v(3,jj)<vmin3) | (v(3,jj)>vmax3)
q(1,jj)=q(1,jj)+0.1*qmax1;
end
q(1,jj+200)=q(1,jj);
q(2,jj+200)=q(2,jj);
end
%fitness_function
jj=Pnumber/2;
fitness_function(k,i)=pp*nnn-((5.2975+0.002023802*v20-1.760249*10^(-8)*v20^2+6.4832*10^(-14)*v20^3)*v10+(36.9919+0.0007061*v30-2.3679*10^(-12)*v30^2+2.1528*10^(-15)*v30^3)*(v10+v20)+64.6*v10+0.00015566*v10^2-0.6944*10^(-10)*v10^3+1.3594*10^(-17)*v10^4+5.2975*v20+0.001011901*v20^2-0.58675*10^(-8)*v20^3+1.6208*10^(-14)*v20^4+36.9919*v30+0.000353*v30^2-0.7893*10^(-9)*v30^3+0.5382*10^(-15)*v30^4)+(5.2975+0.002023802*v(2,jj)-1.760249*10^(-8)*v(2,jj)^2+6.4832*10^(-14)*v(2,jj)^3)*v(1,jj)+(36.9919+0.0007061*v(3,jj)-2.3679*10^(-12)*v(3,jj)^2+2.1528*10^(-15)*v(3,jj)^3)*(v(1,jj)+v(2,jj))+64.6*v(1,jj)+0.00015566*v(1,jj)^2-0.6944*10^(-10)*v(1,jj)^3+1.3594*10^(-17)*v(1,jj)^4+5.2975*v(2,jj)+0.001011901*v(2,jj)^2-0.58675*10^(-8)*v(2,jj)^3+1.6208*10^(-14)*v(2,jj)^4+36.9919*v(3,jj)+0.000353*v(3,jj)^2-0.7893*10^(-9)*v(3,jj)^3+0.5382*10^(-15)*v(3,jj)^4;
fitness_computetime=fitness_computetime+1;
if fitness_function(k,i)>maxsat_now
maxsat_now=fitness_function(k,i);
optimal_now(generation,k)=fitness_function(k,i);
aa=chromosome(k,i,:);
if fitness_function(k,i)>maxsat
maxsat=fitness_function(k,i);
optimal(rr,1:2)=[generation fitness_function(k,i)];
qo=[q(1,1:96),q(2,1:96),q(3,1:96)];
end
end
end
%select
%common selection
for i=1:Subpopulation_size
sum_fit=sum_fit+fitness_function(k,i);
end
for i=1:Subpopulation_size
x=sum_fit*rand(1);
n=Subpopulation_size;
while sum_fit>x
sum_fit=sum_fit-fitness_function(k,n);
n=n-1;
end
if n==Subpopulation_size
n=n-1;
end
selected(1,i)=n+1;
end
%reproduce
for i=1:Subpopulation_size
for j=1:String_Length
chromosome_change(k,i,j)=chromosome(k,selected(1,i),j);
end
end
for i=1:Subpopulation_size
for j=1:String_Length
chromosome(k,i,j)=chromosome_change(k,i,j);
end
end
%crossover
Crossover_Number=round(Subpopulation_size*pc/2);
for i=1:Crossover_Number
parent1=selected(1,i);
parent2=selected(1,Subpopulation_size-i);
child1=selected(1,i);
child2=selected(1,Subpopulation_size-i);
sitel1=fix(rand(1)*String_Length)+2;
for j=1:String_Length
if(j<sitel1)
chromosome(k,child1,j)=chromosome_change(k,parent1,j);
chromosome(k,child2,j)=chromosome_change(k,parent1,j);
else
chromosome(k,child1,j)=chromosome_change(k,parent2,j);
chromosome(k,child2,j)=chromosome_change(k,parent1,j);
end
end
end
%mutation
for i=1:Subpopulation_size
for j=1:String_Length
radium=rand(1);
if radium<pm
chromosome(k,i,j)=abs(chromosome(k,i,j)-1);
end
end
end
%elitist strategy
if elitist>0
%if rand(1)>0.5
chromosome(k,fix(Subpopulation_size/2),:)=aa;
end
end
fo(rr,generation)=optimal(rr,2);
if generation>=max_generation
break;
elseif mod(generation,Emigration_generation)==0&Population_number>1%&rand(1)>0.5
%migratory
for k=1:Population_number
for i=1:Population_number
chromosome(k,i,:)=chromosome_change(i,k,:);
end
end
end
if generation-optimal(rr,1)>max_nonincrease_generation
break;
end
generation=generation+1;
end
%output
opt(1)=opt(1)+optimal(rr,1);
opt(2)=opt(2)+optimal(rr,2);
qqq=0;
for jj=1:96
if qo(jj)>qmax1
qqq=1;
end
end
if qqq==0
qo(1:96)
qo(97:192)
qo(193:288)
end
end
opt(1)=opt(1)/maxc;
opt(2)=opt(2)/maxc;
for rr=1:maxc
opt(3)=opt(3)+(optimal(rr,2)-opt(2))^2;
end
opt(3)=(opt(3)/maxc)^0.5;
plot(1:max_generation,fo(1,1:max_generation),1:max_generation,fo(2,1:max_generation),1:max_generation,fo(3,1:max_generation),1:max_generation,fo(4,1:max_generation),1:max_generation,fo(5,1:max_generation))
opt
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -