📄 work.m
字号:
%定义遗传算法参数
NIND=40; %个体数目
MAXGEN=1000; %最大遗传代数
NVAR=50; %变量的维数
PRECI=20; %变量的二进制位数
GGAP=0.9; %代沟
trace=zeros(MAXGEN,2); %建立区域描述器
vari=zeros(0,NVAR*PRECI); %建立区域描述器
FieldD=[rep([PRECI],[1,NVAR]);rep([-500;500],[1,NVAR]);rep([1;0;1;1],[1,NVAR])];
Chrom=crtbp(NIND,NVAR*PRECI); %创建初始种群
gen=0; %代计数器
variable=bs2rv(Chrom,FieldD); %将二进制转换为十进制
v=variable'; %考虑到sum是对列求和,将variable转置
w=-sum(v.*sin(sqrt(abs(v)))); %计算初始种群个体的目标函数值
ObjV=w'; %转置
while gen<MAXGEN, %迭代
FitnV=ranking(ObjV); %分配适应度值
SelCh=select('sus',Chrom,FitnV,GGAP); %选择
SelCh=recombin('xovsp',SelCh,0.7); %重组
SelCh=mut(SelCh); %变异
variable=bs2rv(SelCh,FieldD); %二进制转十进制
v=variable'; %考虑sum,转置
w=-sum(v.*sin(sqrt(abs(v)))); %计算经过选择、重组、交叉后子代的目标函数值
ObjVSel=w'; %转置
[Chrom ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入
gen=gen+1; %计代数
[trace(gen,1),loc]=min(ObjV); %从子代中选择函数值最小的,存至trace数组,并记录此最小值的位置loc
mid=Chrom(loc,:); %从子代中取出函数最小值的各二进制变量
vari=[vari;mid]; %存至vari数组
trace(gen,2)=sum(ObjV)/length(ObjV); %记录当前代数平均函数值
end
plot(trace(:,1));hold on; %画出每代函数最小值
[m,n]=min(trace(:,1)); %计算历代函数最小值,记录位置n
va=bs2rv(vari,FieldD); %二进制转十进制
var=va(n,:); %历代函数最小值的50个变量
string1=['最终值',num2str(m)];
gtext(string1);
plot(trace(:,2),'-.');grid;
legend('种群最小值的变化','平均值的变化');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -