遗传算法的概念最早是由Bagley J.D在1967年提出的;而开始遗传算法的理论和方法的系统性研究的是1975年,这一开创性工作是由Michigan大学的J.H.Holland所实行。当时,其主要目的是说明自然和人工系统的自适应过程。

遗传算法简称GA(Genetic Algorithm),在本质上是一种不依赖具体问题的直接搜索方法。遗传算法在模式识别、神经网络、图像处理、机器学习、工业优化控制、自适应控制、生物科学、社会科学等方面都得到应用。在人工智能研究中,目前人们认为“遗传算法、自适应系统、细胞自动机、混沌理论与人工智能一样,都是对今后十年的计算技术有重大影响的关键技术”。
遗传算法的原理是基于自然选择学说,主要包括以下三个方面:
(1)遗传:这是生物的普遍特征,亲代把生物信息交给子代,子代总是和亲代具有一样或类似的性状。生物有了这个特征,物种才能稳定存在。
(2)变异:亲代和子代之间以及子代的不同个体之间的差异,称为变异。变异是随机发生的,变异的选择和积累是生命多样性的根源。
(3)生存斗争和适者生存:具有适应性变异的个体被保留下来,不具有适应性变异的个体被淘汰,通过一代代的生存环境的选择作用,性状逐渐逐渐与祖先有所不同,演变为新的物种。
遗传算法将“优胜劣汰,适者生存”的生物进化原理引入优化参数形成的编码串联群体中,按所选择的适应度函数并通过遗传中的复制、交叉及变异对个体进行筛选,使适适应度高的个体被保留下来,组成新的群体,新的群体既继承了上一代的信息,又优于上一代。这样周而复始,群体中个体适应度不断提高,直到满足必定的条件。遗传算法的算法简单,可并行处理,并能到全局最优解。
遗传算法目前在许多生产领域进行了应用,例如:(1)函数优化。(2)组合优化。(3)生产调度问题。(4)自动控制。(5)机器人。(6)图像处理。
下图函数具有一个全局最优点和多个局部最优点,就可以用遗传算法来进行寻解。

遗传算法的操作过程相对简单,具体的实施流程如下:

遗传算法的优点:
(1)群体搜索,易于并行化处理;
(2)不是盲目穷举,而是启发式搜索;
(3)适应度函数不受连续、可微等条件的约束,适用范围很广。
(4)容易实现。一旦有了一个遗传算法的程序,如果想解决一个新的问题,只需针对新的问题重新进行基因编码就行;如果编码方法也一样,那只需要改变一下适应度函数就可以了。
遗传算法的缺点:
(1)全局搜索能力不强,很容易陷入局部最优解跳不出来;(可结合SA进行改善,由于SA在理率上是100%得到全局最优的,但搜索代价高)
下面是遗传算法用于PID控制的matlab最优化求解程序,同时给出了迭代的结果,不同的迭代循环可能产生不同的路径寻优方式。

clc
clear
close all
%global sys_controlled
%global time
global Ball_Hoop_d
rand('state',0);
%____________________________________________________________________
%Defining the ball and hoop system
hoop=tf([1.63],[.66 1]);
H=tf([67.5],[1 0]);
sys_ball=tf([.42 1.873 0],[1.42 1.873 112.11]);
sys_hoop=series(hoop,H);
Ball_Hoop=series(sys_hoop,sys_ball);
Ball_Hoop_d=c2d(Ball_Hoop,.01,'zoh');
%____________________________________________________________________
%Initialising the genetic algorithm
populationSize=3000;
variableBounds=[-10000 10000;-10000 10000;-10000 10000];
evalFN='Ultimate_PID_objfun_mse';%Change this to relevant object function
evalOps=[];
options=[1e-6 1];
initPop=initializega(populationSize,variableBounds,evalFN,evalOps,options);
%____________________________________________________________________
%Setting the parameters for the genetic algorithm
bounds=[-10000 10000;-10000 10000;-10000 10000];
evalFN='Ultimate_PID_objfun_mse';%change this to relevant object function
evalOps=[];
startPop=initPop;
opts=[1e-6 1 0];
termFN='maxGenTerm';
termOps=300;
selectFN='normGeomSelect';
selectOps=0.08;
xOverFNs='arithXover';
xOverOps=4;
mutFNs='unifMutation';
mutOps=500;
%____________________________________________________________________
%Iterating the genetic algorithm
[x,endPop,bPop,traceInfo]=ga(bounds,evalFN,evalOps,startPop,opts,…
termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps);
%____________________________________________________________________
%Generating the Continuous PID Controller
den_pid=[1 0];
num_pid=[x(1) x(2) x(3)]; %Kd Kp Ki
sys_pid=tf(num_pid,den_pid);
%Discretizing the Continuous PID Controller
disp('PID controller')
sysd_pid=c2d(sys_pid,.01,'tustin')
%____________________________________________________________________
%Creating the controlled System
sys_controlled=feedback(series(sysd_pid,Ball_Hoop_d),1);
figure(1)
time =0:0.01:10;
u=.4*ones(size(time));
lsim(sys_controlled,u,time);
%____________________________________________________________________
%Printing to screen the PID values
%x
disp('_________________________________')
disp('| PID GAIN VALUES |')
disp('|________________________________|')
disp('| Kd Kp Ki |');
disp([x(1) x(2) x(3)]);
disp('|________________________________|')
%____________________________________________________________________
%Printing to screen the PID values
%x
%disp(' Kd Kp Ki');
%disp('ZN: 4.74 6 1.91');
%disp( x );
%____________________________________________________________________
%Plotting best population progress
figure(2)
subplot(3,1,1),plot(bPop(:,1),bPop(:,3)),…
title('Kp Value'),, ylabel('Gain');
subplot(3,1,2),plot(bPop(:,1),bPop(:,4)),…
title('Ki Value'),, ylabel('Gain');
subplot(3,1,3),plot(bPop(:,1),bPop(:,2)),…
title('Kd Value'),xlabel('Generations'), ylabel('Gain');
%____________________________________________________________________
%Informing user if the system is unstable
poles=pole(sys_controlled);
if abs(real(poles(1)))>1
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('%THIS SYSTEM IS UNSTABLE DUE TO POLE 1%')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('REAL POLE VALUE')
disp(poles(1))
elseif abs(imag(poles(1)))>1
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('%THIS SYSTEM IS UNSTABLE DUE TO POLE 1%')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('IMAGINARY POLE VALUE')
disp(poles(1))
elseif abs(real(poles(2)))>1
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('%THIS SYSTEM IS UNSTABLE DUE TO POLE 2%')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('REAL POLE VALUE')
disp(poles(2))
elseif abs(imag(poles(2)))>1
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('%THIS SYSTEM IS UNSTABLE DUE TO POLE 2%')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('IMAGINARY POLE VALUE')
disp(poles(2))
elseif abs(real(poles(3)))>1
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('%THIS SYSTEM IS UNSTABLE DUE TO POLE 3%')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('REAL POLE VALUE')
disp(poles(3))
elseif abs(imag(poles(3)))>1
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('%THIS SYSTEM IS UNSTABLE DUE TO POLE 3%')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('IMAGINARY POLE VALUE')
disp(poles(3))
elseif abs(real(poles(4)))>1
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('%THIS SYSTEM IS UNSTABLE DUE TO POLE 4%')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('REAL POLE VALUE')
disp(poles(4))
elseif abs(imag(poles(4)))>1
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('%THIS SYSTEM IS UNSTABLE DUE TO POLE 4%')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('IMAGINARY POLE VALUE')
disp(poles(4))
elseif abs(real(poles(5)))>1
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('%THIS SYSTEM IS UNSTABLE DUE TO POLE 5%')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('REAL POLE VALUE')
disp(poles(5))
elseif abs(imag(poles(5)))>1
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('%THIS SYSTEM IS UNSTABLE DUE TO POLE 5%')
disp('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%')
disp('IMAGINARY POLE VALUE')
disp(poles(5))
elseif abs(imag(poles))<1
disp('This system is stable');
elseif abs(real(poles))<1
disp('This system is stable');
end
%__