当问题不是凸问题,且不是线性规划(Linear programming,简称LP),其他方法都不好解决甚至无法求解时,遗传算法可以提供一种新的思路优化求解该问题,相当于一种“暴力”解法。
根据下面的代码,可以很简单的理解遗传算法的原理。我们的目标是使
最小,即最接近y值,求E最小时的表示参数A,B,C。
首先定义x, y;
定义产生多少代(generations),即迭代次数;
一代有多少个“儿子”(trails)
在这些“儿子”中保留前10(Keep trails)个好的,其他的去掉,根据这10个“儿子”的“基因”(值)变异,重新产生50个(1代),重复这个过程。完整代码如下:
clear all;close all;clc
x = 1:24;
y = [75 77 76 73 69 68 63 59 57 55 54 52 50 50 49 49 49 50 54 56 59 63 67 72];
plot(x,y,'ko');
m=200; %generations
n=50;%trials
n2=10; % kept trials
A=12 + randn(n,1);
B=pi/12 + randn(n,1);
C=60 + randn(n,1);
for jgen=1:m
for j=1:n
E(j)=sum((A(j)*cos(B(j)*x)+C(j)-y).^2);
end
plot(E), pause(0.5)
[Es,Ej]=sort(E);%sort from small to large
Ak1 = A(Ej(1:n2));
Bk1 = B(Ej(1:n2));
Ck1 = C(Ej(1:n2));
Ak2 = Ak1+randn(n2,1)/jgen;
Bk2 = Bk1+randn(n2,1)/jgen;
Ck2 = Ck1+randn(n2,1)/jgen;
Ak3 = Ak1+randn(n2,1)/jgen;
Bk3 = Bk1+randn(n2,1)/jgen;
Ck3 = Ck1+randn(n2,1)/jgen;
Ak4 = Ak1+randn(n2,1)/jgen;
Bk4 = Bk1+randn(n2,1)/jgen;
Ck4 = Ck1+randn(n2,1)/jgen;
Ak5 = Ak1+randn(n2,1)/jgen;
Bk5 = Bk1+randn(n2,1)/jgen;
Ck5 = Ck1+randn(n2,1)/jgen;
A=[Ak1;Ak2;Ak3;Ak4;Ak5];
B=[Bk1;Bk2;Bk3;Bk4;Bk5];
C=[Ck1;Ck2;Ck3;Ck4;Ck5];
end
结果:
可以看到,误差E在不断地减小,不断优化,找到基因最好的“儿子”,最后确定最优参数。