很多朋友在碰到多变量值优化的问题的时候不能很好的将问题转化,利用有效编码的方法将解的个数,解的编码很好的很合理的进行设计,因此不能利用遗传算法进行问题的求解!
其实,简单的来说,就是将多个变量的数值编码编排进去,进行组合,只需要增长基因个体的长度,但是要明确每个变量具体的位置,然后让每个变量转化成二进制的等长编码,组合在一起,就可以来运算了!
当然,我们要利用一个矩阵去跟踪每组迭代的结果的大小:
trace = zeros(3,MAXGEN);
然后,要构造一个译码矩阵FieldD,由bs2rv函数将种群Chrom根据译码矩阵换成时值向量,返回十进制的矩阵:
且FieldD矩阵的结构如下:
FieldD=[len;lb;ub;code;scale;lbin;ubin];每个变量的含义最好搞清楚,不然得到的结果就不好了!
ObjV = Y.*sin(2*pi*X)+X.*cos(2*pi*Y); 当然我们也要有一个比较好的代价函数
这个是函数的主体部分:
while gen < MAXGEN FitnV = ranking(-ObjV); Selch = select(‘sus‘,Chrom,FitnV,GGAP); Selch = recombin(‘xovsp‘,Selch,px); Selch = mut(Selch,pm); XY = bs2rv(Selch,FieldD); X = XY(:,1);Y = XY(:,2); ObjvSel = Y.*sin(2*pi*X)+X.*cos(2*pi*Y); [Chrom,ObjV] = reins(Chrom,Selch,1,1,ObjV,ObjvSel); XY = bs2rv(Chrom,FieldD); gen = gen + 1; [Y,I] = min(ObjV); trace(1:2,gen) = XY(I,:); trace(3,gen) = Y; end
当然我们也要先将目标函数显示出来,看看基本的函数的形式:
还有就是设计遗传算法的参数估计:基本上也都差不太多,更我上一篇博客基本一样!
NIND = 40; MAXGEN = 50; PRECI = 20; GGAP = 0.95; px = 0.7; pm = 0.01;
经遗传算法之后,这个最优解的位置是:(图中标记蓝点的位置)
算法的迭代次数和优化的趋势是:
最优解是:X = -1.2624 Y = 1.9999 Z = -3.2563