仿生智能算法系列之四—遗传算法

阿里云教程3个月前发布
29 1 0

遗传算法的概念最早是由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

%__

© 版权声明

相关文章

1 条评论

none
暂无评论...