本人刚学MATLAB遗传算法工具箱,请大家帮我看一下这个简单一元函数优化错误的原因及怎样修改。

close all;
figure;
fplot('variable*sin(10*pi*variable)+2.0',[-1,2]);%画出函数原图
NIND=40;%个体数目
MAXGEN=25;%最大遗传代数
PRECI=20;%变量的二进制位数,
GGAP=0.9;%代沟
trace=zeros(2,MAXGEN);%创建寻优结果的初始值——2行25列的零矩阵
FieldD=[20;-1;2;1;0;1;1];%区域描述器,子串长度20,下界-1,上界2,二进制编码,算术刻度,包含边界。将子串取值范围锁定在-1至2。
Chrom=crtbp(NIND,PRECI);%创建一个大小为Nind(行,个体数目)*PRECI(列,个体位数)的随机二元矩阵。创建初始种群
gen=0;%代计数器
variable=bs2rv(Chrom,FieldD);%计算初始种群的十进制转换,产生40个介于-1到2之间的值。得到初始种群的十进制值。
ObjV=variable.*sin(10*pi*variable)+2.0;%计算目标函数值40个
while gen<MAXGEN,%若未达到最大遗传代数
FitnV=ranking(-ObjV);%分配适应度值,采用的是-ObjV,按照个体的目标值Objv由大到小的顺序对他们进行排序,ObjV值大者适应度高,使目标函数最大化。缺省默认适应度压差2,线性评估。
SelCh=select('sus',Chrom,FitnV,GGAP);%选择,从种群中选择个体数等于种群个体数目NIND*代沟GGAP。列向量FitnV包含个体的适应度值,适应度值表明了每个个体被选择的预期概率。
SelCh=recombin('xovsp',SelCh,0.7);%重组:采用单点交叉,交叉概率0.7
SelCh=mut(SelCh);%变异:NewChrom=mut(OldChrom,Pm),此处变异概率Pm缺省,默认值为0.7/染色体结构长度Lind。
variable=bs2rv(SelCh,FieldD);%子代个体的十进制转换,得到子代个体的十进制值。
ObjVSel=variable.*sin(10*pi*variable)+2.0;%计算子代的目标函数值
[Chrom ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel);%重插入子代的新种群。因为使用了代沟,子代数量少于前种群,因此使用恢复函数reins.基于适应度的恢复用Selch中的个体代替Chrom中最不适应的个体。
gen=gen+1;%代计数器增加
%输出最优解及其序号,并在目标函数图像中标出,Y为最优解,I为种群的序号
[Y,I]=max(ObjV),hold on;
plot(variable(I),Y,'bo');%遗传算法性能跟踪
trace(1,gen)=max(ObjV);%trace矩阵中第一行为每次迭代后的最优解
trace(2,gen)=sum(ObjV)/length(ObjV);%%trace矩阵中第二行为每次迭代后的最优解的均值。每次迭代后的最优解和解的均值存放到trace中.这个遗传优化的结果包含在矩阵Objv中,决策变量的值为variable(I).length:数组长度(即行数或列数中的较大值),因Obiv为一列值,故取行数,也即个体数。
end
variable=bs2rv(Chrom,FieldD);%最优个体的十进制转换
hold on ,grid;
plot(variable',ObjV','b*');
figure;
plot(trace(1,:)');%trace矩阵中第一行为每次迭代后的最优解
hold on;
plot(trace(2,:)','-.');grid;
legend('解的变化','种群均值的变化')

由于有代沟,所以plot中的variable是36*20的,而I对应的ObjV是40*1的,所以I可能取40个值,但variable只有36行,所以出错。在“gen=gen+1;%代计数器增加”后加variable=bs2rv(Chrom,FieldD),你调试一下试试。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-04-13
先去掉 plot(variable(I),Y,'bo');%遗传算法性能跟踪本回答被网友采纳
相似回答