1. 程式人生 > >遺傳演算法原理簡介及其MATLAB實踐

遺傳演算法原理簡介及其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實現

MATLAB內嵌遺傳演算法工具箱: gadst

Sheffield大學遺傳演算法工具箱:gatbx

北卡羅來納大學遺傳演算法工具箱: gaot

【例】BP神經網路初始權值和閾值優化

%% I. 清除環境變數
clear all
clc

%% II. 宣告全域性變數
global p     % 訓練集輸入資料
global t     % 訓練集輸出資料
global R     % 輸入神經元個數
global S2    % 輸出神經元個數
global S1    % 隱層神經元個數
global S     % 編碼長度
S1 = 10;

%% III. 匯入資料
%%
% 1. 訓練資料
p = [0.01 0.01 0.00 0.90 0.05 0.00;
     0.00 0.00 0.00 0.40 0.50 0.00;
     0.80 0.00 0.10 0.00 0.00 0.00;
     0.00 0.20 0.10 0.00 0.00 0.10]';
t = [1.00 0.00 0.00 0.00;
     0.00 1.00 0.00 0.00;
     0.00 0.00 1.00 0.00;
     0.00 0.00 0.00 1.00]';
%%
% 2. 測試資料
P_test = [0.05 0    0.9  0.12 0.02 0.02;
          0    0    0.9  0.05 0.05 0.05;
          0.01 0.02 0.45 0.22 0.04 0.06;
          0    0    0.4  0.5  0.1  0;
          0    0.1  0    0    0    0]';

%% IV. BP神經網路
%%
% 1. 網路建立
net = newff(minmax(p),[S1,4],{'tansig','purelin'},'trainlm'); 

%%
% 2. 設定訓練引數
net.trainParam.show = 10;
net.trainParam.epochs = 2000;
net.trainParam.goal = 1.0e-3;
net.trainParam.lr = 0.1;

%%
% 3. 網路訓練
[net,tr] = train(net,p,t);

%%
% 4. 模擬測試
s_bp = sim(net,P_test)    % BP神經網路的模擬結果

%% V. GA-BP神經網路
R = size(p,1);
S2 = size(t,1);
S = R*S1 + S1*S2 + S1 + S2;
aa = ones(S,1)*[-1,1];

%% VI. 遺傳演算法優化
%%
% 1. 初始化種群
popu = 50;  % 種群規模
initPpp = initializega(popu,aa,'gabpEval',[],[1e-6 1]);  % 初始化種群

%%
% 2. 迭代優化
gen = 100;  % 遺傳代數
% 呼叫GAOT工具箱,其中目標函式定義為gabpEval
[x,endPop,bPop,trace] = ga(aa,'gabpEval',[],initPpp,[1e-6 1 1],'maxGenTerm',gen,...
                           'normGeomSelect',[0.09],['arithXover'],[2],'nonUnifMutation',[2 gen 3]);
%%
% 3. 繪均方誤差變化曲線
figure(1)
plot(trace(:,1),1./trace(:,3),'r-');
hold on
plot(trace(:,1),1./trace(:,2),'b-');
xlabel('Generation');
ylabel('Sum-Squared Error');

%%
% 4. 繪製適應度函式變化
figure(2)
plot(trace(:,1),trace(:,3),'r-');
hold on
plot(trace(:,1),trace(:,2),'b-');
xlabel('Generation');
ylabel('Fittness');

%% VII. 解碼最優解並賦值
%%
% 1. 解碼最優解
[W1,B1,W2,B2,val] = gadecod(x);

%%
% 2. 賦值給神經網路
net.IW{1,1} = W1;
net.LW{2,1} = W2;
net.b{1} = B1;
net.b{2} = B2;

%% VIII. 利用新的權值和閾值進行訓練
net = train(net,p,t);

%% IX. 模擬測試
s_ga = sim(net,P_test)    %遺傳優化後的模擬結果