📄 ga_simple.m
字号:
function ga_simple(prompt,def)
%(NIND,NVAR,bounds,evalFN,MAXGEN,PRECI,GGAP,pCross,FieldD,tag)
%evalFN = 'x + 10*sin(5*x)+7*cos(4*x)';
%figure(1);
%fplot(evalFN,bounds); %画出函数曲线
%定义遗传算法参数
%NIND=80; %个体数目(Number of individuals)
%MAXGEN=50; %最大遗传代数(Maximum number of generations)
%PRECI=20; %变量的二进制位数(Precision of variables);染色体的长度
GGAP=0.9; %代沟(Generation gap)
prompt={'适应度函数Func:','边界范围Bounds:','自变量个数Nvar:','种群总数N:','终止代数R:','交叉率pc:','求最大小值(0,1):'};
%def={'x + 10*sin(5*x)+7*cos(4*x)','[0,9]','1','50','30','0.7','0'};
def={ '0.5+(sin(sqrt(x.*x+y.*y)).* sin(sqrt(x.*x+y.*y))-0.5)./((0.001*(x.*x+y.*y)+1.0).^2)','[-100,100]','2','80','100','0.7','0'};
%def={'((1*cos((1+1)*x+1))+(2*cos((2+1)*x+2))+(3*cos((3+1)*x+3))+(4*cos((4+1)*x+4))+(5*cos((5+1)*x+5))).*((1*cos((1+1)*y+1))+(2*cos((2+1)*y+2))+(3*cos((3+1)*y+3))+(4*cos((4+1)*y+4))+(5*cos((5+1)*y+5)))',...
% '[-10,10]','2','80','100','0.7','0'};
dlgTitle='input';%'参数输入';
lineNo=1;
answer=inputdlg(prompt,dlgTitle,lineNo,def);
answer=char(answer);
evalFN=(answer(1,:));
bounds=str2num(answer(2,:));
NIND=str2num(answer(4,:));
NVAR=str2num(answer(3,:));
MAXGEN=str2num(answer(5,:));
pCross=str2num(answer(6,:));
tag=str2num(answer(7,:));
tic;
PRECI=ceil(log2((bounds(:,2)-bounds(:,1))' ./ (1e-6))); % Chrom's length
if NVAR==1
FieldD=[PRECI;bounds(1);bounds(2);1;0;1;1];
else FieldD=[rep([PRECI],[1,NVAR]);rep([bounds(1);bounds(2)],[1,NVAR]);rep([1;0;1;1],[1,NVAR])];
end
len=NVAR*PRECI;
trace=zeros(MAXGEN,3); %寻优结果的初始值
%FieldD=[20;bounds(1);bounds(2);1;0;1;1]; %区域描述器(Build field descriptor)
Chrom=crtbp(NIND,len ); %初始种群
%pop_temp=chaos_serial(evalFN,bounds,NIND,NVAR,PRECI);
%pop_temp=round(rand(NIND-2,len));
%Chrom=[zeros(1,len);pop_temp;ones(1,len)];
gen=0; %代计数器
if NVAR==1
x=bs2rv(Chrom, FieldD); %计算初始种群的十进制转换
elseif NVAR==2
p=bs2rv(Chrom, FieldD);
x=p(:,1);
y=p(:,2);
end
ObjV = eval(evalFN); %计算目标函数值
while gen<MAXGEN
if tag==0
FitnV=ranking(-ObjV); %分配适应度值(Assign fitness values)
else FitnV=ranking(ObjV);
end
SelCh=select('sus', Chrom, FitnV, GGAP); %选择
SelCh=recombin('xovsp', SelCh, pCross); %交叉
SelCh=mut(SelCh); %变异
p=bs2rv(SelCh, FieldD); %子代个体的十进制转换
if NVAR==1
x=p;
elseif NVAR==2
x=p(:,1);
y=p(:,2);
end
ObjVSel=eval(evalFN); %计算子代的目标函数值
[Chrom ObjV]=reins(Chrom, SelCh, 1, 1, ObjV, ObjVSel); %重插入子代的新种群
gen=gen+1; %代计数器增加
optim=min(ObjV);
if tag==0
[Y, I]=max(ObjV);
if optim<=Y
optim=Y;
p=bs2rv(Chrom(I,:),FieldD);
if NVAR==1
bstch=p;
elseif NVAR==2
bstch=p(:,1)+i*p(:,2);
end
end
elseif tag==1
[Y, I]=min(ObjV);
if optim >= Y
optim=Y;
p=bs2rv(Chrom(I,:),FieldD);
if NVAR==1
bstch=p;
elseif NVAR==2
bstch=p(:,1)+i*p(:,2);
end
end
end
% Y, x=r(:,1), y=r(:,2), %输出最优解及其序号,并在目标函数图像中标出,Y为最优解,I为种群的序号
trace(gen,1)= max(ObjV); %遗传算法性能跟踪
trace(gen,2)=sum(ObjV)/length(ObjV);
trace(gen,3)=min(ObjV);
end
if tag==0
optim=max(trace(:,1));
plot(trace(:,1));
hold on;plot(I,optim,'*');
plot(trace(:,2),'r-.');grid
hold on;
plot(trace(:,3),':');
text(I,optim,['FMax=' num2str(optim)]);
str1=sprintf('进化到 %d 代 ,自变量为 %s 时,得本次求解的最优值 %f\n对应染色体是:%s\n use times: %5.2f',...
I,num2str(bstch),optim,num2str(Chrom(I,:)),toc);
disp(str1);
legend('解的变化','种群均值的变化','种群最小值的变化')
elseif tag==1
optim=min(trace(:,3));
plot(trace(:,3));
hold on;plot(I,optim,'*');
plot(trace(:,2),'r-.');grid
hold on;
plot(trace(:,1),':');
text(I,optim,['FMin=' num2str(optim)]);
str1=sprintf('进化到 %d 代 ,自变量为 %s 时,得本次求解的最优值 %f\n对应染色体是:%s\n use times: %5.2f',...
I,num2str(bstch),optim,num2str(Chrom(I,:)),toc);
disp(str1);
legend('解的变化','种群均值的变化','种群最大值的变化')
end
title('函数优化的遗传算法');xlabel('进化世代数(Generation)');ylabel('每一代适应度(Fitness)');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -