遺傳算法(Genetic Algorithm, GA)及MATLAB實現


遺傳算法概述:

• 遺傳算法(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM