遗传算法(Genetic Algorithm, GA)及MATLAB实现

时间:2024-02-23 07:08:33

遗传算法概述:

• 遗传算法(Genetic Algorithm,GA)是一种进化算法,其基本原理是仿效生物界中的“物竞天择、适者生存”的演化法
则,它最初由美国Michigan大学的J. Holland教授于1967年提出。
• 遗传算法是从代表问题可能潜在的解集的一个种群(population)开始的,而一个种群则由经过基因(gene)编码的一
定数目的个体(individual)组成。因此,第一步需要实现从表现型到基因型的映射即编码工作。初代种群产生之后,按照
适者生存和优胜劣汰的原理,逐代(generation)演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度
(fitness)大小选择个体,并借助于自然遗传学的遗传算子(genetic operators)进行组合交叉和变异,产生出代表新
的解集的种群。这个过程将导致种群像自然进化一样,后生代种群比前代更加适应于环境,末代种群中的最优个体经过解
码(decoding),可以作为问题近似最优解。

• 遗传算法有三个基本操作:选择(Selection)、交叉(Crossover)和变异(Mutation)
• (1)选择。选择的目的是为了从当前群体中选出优良的个体,使它们有机会作为父代为下一代繁衍子孙。根据各个个体的
适应度值,按照一定的规则或方法从上一代群体中选择出一些优良的个体遗传到下一代种群中。选择的依据是适应性强的
个体为下一代贡献一个或多个后代的概率大。
• (2)交叉。通过交叉操作可以得到新一代个体,新个体组合了父辈个体的特性。将群体中的各个个体随机搭配成对,对每
一个个体,以交叉概率交换它们之间的部分染色体。
• (3)变异。对种群中的每一个个体,以变异概率改变某一个或多个基因座上的基因值为其他的等位基因。同生物界中一样,
变异发生的概率很低,变异为新个体的产生提供了机会。

遗传算法的基本步骤:

1)编码:GA在进行搜索之前先将解空间的解数据表示成遗传空间的基因型串结构数据,
这些串结构数据的丌同组合便构成了丌同的点。
2)初始群体的生成:随机产生N个初始串结构数据,每个串结构数据称为一个个体,N个
个体构成了一个群体。GA以这N个串结构数据作为初始点开始进化。
3)适应度评估:适应度表明个体或解的优劣性。丌同的问题,适应性函数的定义方式也丌
同。

4)选择:选择的目的是为了从当前群体中选出优良的个体,使它们有机会作为父代为下一
代繁殖子孙。遗传算法通过选择过程体现这一思想,进行选择的原则是适应性强的个体为
下一代贡献一个或多个后代的概率大。选择体现了达尔文的适者生存原则。
5)交叉:交叉操作是遗传算法中最主要的遗传操作。通过交叉操作可以得到新一代个体,
新个体组合了其父辈个体的特性。交叉体现了信息交换的思想。
6)变异:变异首先在群体中随机选择一个个体,对于选中的个体以一定的概率随机地改变
串结构数据中某个串的值。同生物界一样, GA中变异发生的概率很低,通常取值很小。

 

遗传算法工具箱:

• MATLAB内嵌遗传算法工具箱: gadst
• Sheffield大学遗传算法工具箱: gatbx
• 北卡罗来纳大学遗传算法工具箱: gaot

 initializega函数:

 ga函数:

遗传算法优化BP神经网络初始权值与阈值:

 

 

 Demo1(一元函数优化MATLAB实现):

main.m

 1 %% I. 清空环境变量
 2 clear all
 3 clc
 4 
 5 %% II. 绘制函数曲线
 6 x = 0:0.01:9;
 7 y =  x + 10*sin(5*x)+7*cos(4*x);
 8 
 9 figure
10 plot(x, y)
11 xlabel(\'自变量\')
12 ylabel(\'因变量\')
13 title(\'y = x + 10*sin(5*x) + 7*cos(4*x)\')
14 
15 
16 %% III. 初始化种群
17 initPop = initializega(50,[0 9],\'fitness\');
18 
19 %% IV. 遗传算法优化
20 [x endPop bpop trace] = ga([0 9],\'fitness\',[],initPop,[1e-6 1 1],\'maxGenTerm\',25,...
21                            \'normGeomSelect\',0.08,\'arithXover\',2,\'nonUnifMutation\',[2 25 3]);
22 
23 
24 %% V. 输出最优解并绘制最优点
25 x
26 hold on
27 plot (endPop(:,1),endPop(:,2),\'ro\')
28 
29 %% VI. 绘制迭代进化曲线
30 figure(2)
31 plot(trace(:,1),trace(:,3),\'b:\')
32 hold on
33 plot(trace(:,1),trace(:,2),\'r-\')
34 xlabel(\'Generation\'); ylabel(\'Fittness\');
35 legend(\'Mean Fitness\', \'Best Fitness\')

initializega.m

 1 function [pop] = initializega(num, bounds, evalFN,evalOps,options)
 2 
 3 if nargin<5
 4   options=[1e-6 1];
 5 end
 6 if nargin<4
 7   evalOps=[];
 8 end
 9 
10 if any(evalFN<48) %Not a .m file
11   if options(2)==1 %Float GA
12     estr=[\'x=pop(i,1); pop(i,xZomeLength)=\', evalFN \';\'];  
13   else %Binary GA
14     estr=[\'x=b2f(pop(i,:),bounds,bits); pop(i,xZomeLength)=\', evalFN \';\']; 
15   end
16 else %A .m file
17   if options(2)==1 %Float GA
18     estr=[\'[ pop(i,:) pop(i,xZomeLength)]=\' evalFN \'(pop(i,:),[0 evalOps]);\']; 
19   else %Binary GA
20     estr=[\'x=b2f(pop(i,:),bounds,bits);[x v]=\' evalFN ...
21     \'(x,[0 evalOps]); pop(i,:)=[f2b(x,bounds,bits) v];\'];  
22     end
23 end
24 
25 
26 numVars     = size(bounds,1);         %Number of variables
27 rng         = (bounds(:,2)-bounds(:,1))\'; %The variable ranges\'
28 
29 if options(2)==1 %Float GA
30   xZomeLength = numVars+1;         %Length of string is numVar + fit
31   pop         = zeros(num,xZomeLength);     %Allocate the new population
32   pop(:,1:numVars)=(ones(num,1)*rng).*(rand(num,numVars))+...
33     (ones(num,1)*bounds(:,1)\');
34 else %Binary GA
35   bits=calcbits(bounds,options(1));
36   xZomeLength = sum(bits)+1;         %Length of string is numVar + fit
37   pop = round(rand(num,sum(bits)+1));
38 end
39 
40 for i=1:num
41   eval(estr);
42 end

fitness.m

1 function [sol, fitnessVal] = fitness(sol, options)
2 
3 x = sol(1);
4 
5 fitnessVal = x + 10*sin(5*x)+7*cos(4*x);
6 
7 end

原始函数图像:

 

标记出最大值:

绘制迭代进化曲线:

 注:运行以上程序,需要下载gaot的工具箱并添加到运行路径里才能运行,否则会报错。

附测试代码:https://github.com/shixinzei/Learn-about-Genetic-Algorithm