新手学习遗传算法过程中,三元的遗传算法不会建立。求一个可以方便改动的算例。
下面是网上的三元遗传算法程序,但是我不知道在哪里改适应度函数。。。。
clear all;close all; %释放所有变量,关闭图形窗口,清除命令窗口
%定义遗传算法参数
NIND=150; %个体数目(Numbe of individuals)
MAXGEN=200; %最大遗传代数(Maximum number of generations)
NVAR=3; %变量的维数
PRECI=20; %变量的二进制位数(Precision of variables)
GGAP=0.9; %代沟(Generation gap)
trace=zeros(MAXGEN, 2);
%建立区域描述器(Build field descriptor)
FieldD=[rep([PRECI],[1,NVAR]);rep([-5.12;5.12],[1, NVAR]);rep([1;0;1;1],[1,NVAR])];
Chrom=crtbp(NIND, NVAR*PRECI); %创建初始种群
gen=0; %代计数器
ObjV= objfun1(bs2rv(Chrom,FieldD)); %计算初始种群个体的目标函数值
while gen<MAXGEN %迭代
FitnV=ranking(ObjV); %分配适应度值(Assign fitness values)
SelCh=select('sus', Chrom, FitnV, GGAP); %选择
SelCh=recombin('xovsp', SelCh, 0.9); %重组
SelCh=mut(SelCh); %变异
ObjVSel=objfun1(bs2rv(SelCh, FieldD)); %计算子代目标函数值
[Chrom ObjV]=reins(Chrom, SelCh, 1, 1, ObjV, ObjVSel); %重插入
gen=gen+1; %代计数器增加
trace(gen, 1)=min(ObjV); %遗传算法性能跟踪
trace(gen, 2)=sum(ObjV)/length(ObjV);
end
plot(trace(:,1),'r');hold on;
plot(trace(:,2),'-.');grid;
title('最小值/均值 变化趋势');xlabel('Generations');ylabel('最小值/均值');
legend('最小值的变化','种群函数值均值的变化')
%输出最优解及其对应的20个自变量的十进制值,Y为最优解,I为种群的序号
%[A, I]=min(ObjV)
% X=bs2rv(Chrom, FieldD);
% X(I,:)
disp(sprintf('种群数目:%d',NIND));
disp(sprintf('遗传代数:%d',MAXGEN));
disp(sprintf('代沟:%d',GGAP));
[Y,I]=min(trace(:,1));
disp(sprintf('最小值:'));Y
y1=trace(I:size(trace,1),1); %全局最小值之后的每代最小值
length1=length(y1);
y2=find(y1==Y);
length2=length(y2);
if length2==length(y2)&&length2>=10
disp(sprintf('收敛次数:%d,占总迭代次数比例:%4f',I,I/MAXGEN));
else
disp(sprintf('最小值所在代数:%d',I));
disp(sprintf('暂未收敛'));
end