📄 binsga.m
字号:
%二进制码基本遗传算法主程序
function f=BinSGA;
%OptimizationStyle='Min';VarietyNumber=3;Xmin=[-5.12,-5.12,-5.12];Xmax=[5.12,5.12,5.12];PopulationSize=100;GenotypeLength=20;MaxGeneration=200;Pc=0.9;Pm=0.01;
OptimizationStyle='Min';VarietyNumber=2;Xmin=[-2.048,-2.048];Xmax=[2.048,2.048];PopulationSize=100;GenotypeLength=20;MaxGeneration=200;Pc=0.85;Pm=0.1;
%OptimizationStyle='Min';VarietyNumber=5;Xmin=[-5.12,-5.12,-5.12,-5.12,-5.12];Xmax=[5.12,5.12,5.12,5.12,5.12];PopulationSize=100;GenotypeLength=20;MaxGeneration=200;Pc=0.9;Pm=0.1;
%OptimizationStyle='Min';VarietyNumber=2;Xmin=[-100,-100];Xmax=[100,100];PopulationSize=100;GenotypeLength=20;MaxGeneration=200;Pc=0.95;Pm=0.01;
%OptimizationStyle='Min';VarietyNumber=2;Xmin=[-100,-100];Xmax=[100,100];PopulationSize=100;GenotypeLength=20;MaxGeneration=200;Pc=0.95;Pm=0.01;
%OptimizationStyle='Min';VarietyNumber=2;Xmin=[-2,-2];Xmax=[2,2];PopulationSize=100;GenotypeLength=20;MaxGeneration=200;Pc=0.9;Pm=0.05;
%OptimizationStyle='Min';VarietyNumber=2;Xmin=[-10,-10];Xmax=[10,10];PopulationSize=100;GenotypeLength=20;MaxGeneration=200;Pc=0.9;Pm=0.05;
%OptimizationStyle='Min';VarietyNumber=2;Xmin=[-3,-2];Xmax=[3,2];PopulationSize=100;GenotypeLength=20;MaxGeneration=200;Pc=0.8;Pm=0.1;
initpop=randint(PopulationSize,VarietyNumber*GenotypeLength+VarietyNumber+2);
oldpop=decode(OptimizationStyle,VarietyNumber,PopulationSize,Xmin,Xmax,GenotypeLength,initpop);
k=1;
while k<=MaxGeneration
newpop=selection(VarietyNumber,PopulationSize,GenotypeLength,oldpop);
randorder=randperm(PopulationSize);
for i=1:2:(PopulationSize-1)
parent1=newpop(randorder(i),:);
parent2=newpop(randorder(i+1),:);
[child1,child2]=crossover(VarietyNumber,GenotypeLength,parent1,parent2,Pc);
newpop(randorder(i),:)=child1;
newpop(randorder(i+1),:)=child2;
end
for i=1:PopulationSize
newpop(i,:)=mutation(VarietyNumber,GenotypeLength,newpop(i,:),Pm);
end
newpop=decode(OptimizationStyle,VarietyNumber,PopulationSize,Xmin,Xmax,GenotypeLength,newpop);
faveragevalue(k)=mean(newpop(:,VarietyNumber*GenotypeLength+VarietyNumber+1));
if (OptimizationStyle=='Max')
optimization(k,VarietyNumber+1)=max(newpop(:,VarietyNumber*GenotypeLength+VarietyNumber+1));
else
optimization(k,VarietyNumber+1)=min(newpop(:,VarietyNumber*GenotypeLength+VarietyNumber+1));
end
[tf,index]=ismember(optimization(k,VarietyNumber+1),newpop(:,VarietyNumber*GenotypeLength+VarietyNumber+1));
optimization(k,1:VarietyNumber)=newpop(index,VarietyNumber*GenotypeLength+1:VarietyNumber*GenotypeLength+VarietyNumber);
oldpop=newpop;
k=k+1;
end
%format short g;
if (OptimizationStyle=='Max')
optimizationf=max(optimization(:,VarietyNumber+1))
else
optimizationf=min(optimization(:,VarietyNumber+1))
end
[tf,index]=ismember(optimizationf,optimization(:,VarietyNumber+1));
optimizationX=optimization(index,1:VarietyNumber)
subplot(1,2,1);
plot(optimization(:,VarietyNumber+1));
subplot(1,2,2);
plot(faveragevalue);
%选择(复制)算子程序
function newpop=selection(VarietyNumber,PopulationSize,GenotypeLength,oldpop);
totalfit=sum(oldpop(:,VarietyNumber*GenotypeLength+VarietyNumber+2));
if (totalfit>1e-15)
prob=oldpop(:,VarietyNumber*GenotypeLength+VarietyNumber+2)/totalfit;
prob=cumsum(prob);
randnum=sort(rand(PopulationSize,1));
oldorder=1;
neworder=1;
while neworder<=PopulationSize
if (randnum(neworder)<prob(oldorder))
newpop(neworder,:)=oldpop(oldorder,:);
neworder=neworder+1;
else
oldorder=oldorder+1;
end
end
else
newpop=oldpop;
end
%交叉算子程序
function [child1,child2]=crossover(VarietyNumber,GenotypeLength,parent1,parent2,Pc);
if(rand<Pc)
cpoint=round(rand*(VarietyNumber*GenotypeLength-2))+1;
child1=[parent1(1:cpoint) parent2(cpoint+1:VarietyNumber*GenotypeLength+VarietyNumber+2)];
child2=[parent2(1:cpoint) parent1(cpoint+1:VarietyNumber*GenotypeLength+VarietyNumber+2)];
else
child1=parent1;
child2=parent2;
end
%变异算子程序
function child=mutation(VarietyNumber,GenotypeLength,parent,Pm);
if(rand<Pm)
child=parent;
mpoint=round(rand*(VarietyNumber*GenotypeLength-1))+1;
child(mpoint)=1-parent(mpoint);
else
child=parent;
end
%解码及求适应度程序
function decodedpop=decode(OptimizationStyle,VarietyNumber,PopulationSize,Xmin,Xmax,GenotypeLength,pop);
decodedpop=pop;
for i=1:VarietyNumber
decodedpop(:,VarietyNumber*GenotypeLength+i)=(2.^(size(pop(:,(((i-1)*GenotypeLength)+1):(i*GenotypeLength)),2)-1:-1:0)*...
pop(:,(((i-1)*GenotypeLength)+1):(i*GenotypeLength))')'*(Xmax(i)-Xmin(i))/(2.^GenotypeLength-1)+Xmin(i);
end
for i=1:PopulationSize
decodedpop(i,VarietyNumber*GenotypeLength+VarietyNumber+1)=functionf(decodedpop(i,(VarietyNumber*GenotypeLength+1):(VarietyNumber*GenotypeLength+VarietyNumber)));
end
if (OptimizationStyle=='Max')
Cmin=min(decodedpop(:,VarietyNumber*GenotypeLength+VarietyNumber+1));
decodedpop(:,VarietyNumber*GenotypeLength+VarietyNumber+2)=decodedpop(:,VarietyNumber*GenotypeLength+VarietyNumber+1)-Cmin;
else
Cmax=max(decodedpop(:,VarietyNumber*GenotypeLength+VarietyNumber+1));
decodedpop(:,VarietyNumber*GenotypeLength+VarietyNumber+2)=Cmax-decodedpop(:,VarietyNumber*GenotypeLength+VarietyNumber+1);
end
%计算目标函数值程序
function f=functionf(x);
%f=x(1)^2+x(2)^2+x(3)^2;
f=100*(x(1)^2-x(2))^2+(1-x(1))^2;
%f=floor(x(1))+floor(x(2))+floor(x(3))+floor(x(4))+floor(x(5));
%f=0.5+(sin(sqrt(x(1)^2+x(2)^2))^2-0.5)/(1+0.001*(x(1)^2+x(2)^2))^2;
%f=(x(1)^2+x(2)^2)^0.25*(sin(50*(x(1)^2+x(2)^2)^0.1)^2+1);
%f=(1+(x(1)+x(2)+1)^2*(19-14*x(1)+3*x(1)^2-14*x(2)+6*x(1)*x(2)+3*x(2)^2))*(30+(2*x(1)-3*x(2))^2*(18-32*x(1)+12*x(1)^2+48*x(2)-36*x(1)*x(2)+27*x(2)^2));
%f=(1*cos((1+1)*x(1)+1)+2*cos((2+1)*x(1)+2)+3*cos((3+1)*x(1)+3)+4*cos((4+1)*x(1)+4)+5*cos((5+1)*x(1)+5))*...
% (1*cos((1+1)*x(2)+1)+2*cos((2+1)*x(2)+2)+3*cos((3+1)*x(2)+3)+4*cos((4+1)*x(2)+4)+5*cos((5+1)*x(2)+5));
%f=(4-2.1*x(1)^2+x(1)^4/3)*x(1)^2+x(1)*x(2)+(4*x(2)^2-4)*x(2)^2;
%f=x+10*sin(5*x)+7*cos(4*x);
%f=cos(5*x)-sin(3*x)+10;
%f=x(1)^2+2*x(2)^2-10*sin(2*x(1))*sin(x(3))+0.5*cos(x(1)+2*x(2))+x(1)^2*x(3)^2-5*sin(2*x(1)-x(2)+3*x(3));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -