天天看點

2021-04-26 Matlab遺傳算法工具箱的使用及執行個體(線性規劃)

Matlab遺傳算法工具箱的使用及執行個體(線性規劃)

引言

在使用遺傳算法(Genetic Algorithm,GA)之前,你得了解遺傳算法是幹什麼的。遺傳算法一般用于求解優化問題。遺傳算法最早是由美國的 John holland于20世紀70年代提出,該算法是根據大自然中生物體進化規律而設計提出的。是模拟達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模拟自然進化過程搜尋最優解的方法。該算法通過數學的方式,利用計算機仿真運算,将問題的求解過程轉換成類似生物進化中的染色體基因的交叉、變異等過程。在求解較為複雜的組合優化問題時,相對一些正常的優化算法,通常能夠較快地獲得較好的優化結果。

遺傳算法的原理和具體流程,各大書籍資料都有,這裡不再贅述。我相信來找工具箱的人對原理有所了解。我們在使用工具箱時,不需要了解他的原理,因為這些已經封裝到工具箱裡了,你隻需要設定參數即可。我将結合線性規劃、非線性規劃兩類問題,來介紹一下MATLAB遺傳算法工具箱的使用。本文先介紹用遺傳算法工具箱求解線性規劃模型,非線性規劃見下期。

線性規劃的标準形式

在使用遺傳算法求解線性規劃問題的時候,需要将模型描述成标準線性規劃的形式。

标準線性規劃

标準線性規劃使用矩陣的形式表示如下:

2021-04-26 Matlab遺傳算法工具箱的使用及執行個體(線性規劃)

是自變量列向量,若有三個自變量,即為(x1,x2,x3)'

min f(x)是目标函數;

A是小于限制中x的系數矩陣,b是小于限制常數項的列向量;

Aeq是等号限制中x的系數矩陣,beq是等号限制中的常數項的列向量;

lb是x的最小取值,ub是x的最大取值

非标準線性規劃轉化為标準線性規劃的執行個體

對于非标準線性規劃的形式,如何化為标準型的線性規劃呢?下面通過一個例子來說.

例如:有以下線性規劃問題:

2021-04-26 Matlab遺傳算法工具箱的使用及執行個體(線性規劃)

可以觀察到,标準型的目标函數是求極小值,而這個案例的目标函數是極大值,我們可以在目标函數f(x)添加一個負号,改為求-f(x),根據中學數學知識可以知道,-f(x)的最小值,就是f(x)的最大值.

在限制條件中,标準型的不等式限制都是小于限制,而案例中出現了大于限制。根據中學知識,不等式的兩邊同時乘一個負數,不等号改變方向。是以,我們隻需要在不等式兩邊同時乘-1即可.

而 x1,x,2,x3>=0是對于自變量定義域的限制。

是以,上述模型可以轉化為:

2021-04-26 Matlab遺傳算法工具箱的使用及執行個體(線性規劃)

根據線性代數的知識,限制條件的方程/不等式組可以用矩陣形式表示:

式[1]是等号限制,可表示為Aeq*x=beq的形式:

2021-04-26 Matlab遺傳算法工具箱的使用及執行個體(線性規劃)

式[2][3]是小于号的限制,可表示為A*x<=b的形式:

2021-04-26 Matlab遺傳算法工具箱的使用及執行個體(線性規劃)

式[4]是自變量的取值範圍,可表示為lb<=x<=ub的形式

2021-04-26 Matlab遺傳算法工具箱的使用及執行個體(線性規劃)

遺傳算法工具箱的使用說明

MATLAB提供的遺傳算法工具箱,主要分為兩個函數:gaoptimset()函數和ga()函數,gaoptimset()函數是用于設定遺傳算法的一些參數的,可以不設定。若不設定,就使用預設參數。ga()函數是調用遺傳算法對優化問題進行計算。

設定遺傳算法參數——gaoptimset()函數的使用

調用格式為: 

options = gaoptimset('Param1', value1, 'Param2', value2, ...);
           

其中,'Param1'、'Param2'等是需要設定的參數,比如:種群規模、交叉比例等。value1、value2等則是Param的具體值。常用的參數名如下表(隻列出了常用的,還有很多參數可以調整,可自行上網搜尋):

gaoptimset函數的常用選項

2021-04-26 Matlab遺傳算法工具箱的使用及執行個體(線性規劃)

例如,需要設定交叉比例為0.7、疊代次數為300、種群規模為30

options = gaoptimset('CrossoverFraction', 0.7, 'Generations', 300, 'PopulationSize', 30);
           

傳回的options是結構體,用于ga函數的最後一個參數

遺傳算法——ga()函數的使用

ga函數的調用格式為:

[x_best,fval] = ga(fun, nvars, A, b, Aeq, beq, lb, ub, nonlcon, options);
           
2021-04-26 Matlab遺傳算法工具箱的使用及執行個體(線性規劃)

在做限制條件為線性的模型時,參數nonlcon直接傳入空矩陣即可,代表不使用。

傳回值x_best為取到最小值時的自變量x的取值,fval為所求的最小值。

執行個體

求下列函數的極小值:

2021-04-26 Matlab遺傳算法工具箱的使用及執行個體(線性規劃)

第一步:把目标函數編寫成函數的形式,便于調用(将x看作x1,y看作x2)

function z = fitnessfun(x)
% 注意,無論有幾個自變量,入口參數都為一個x,表示自變量的矩陣
% 在函數内用x(1)、x(2)等将每個自變量的值索引出來
% 必須以這種格式編寫,否則ga函數報錯
    z = 2 - exp(-(x(1).^2 + x(2).^2));
end
           

​​​​​​第二步:用gaoptimset()函數設定options(ga函數的最後一個參數)

提示:這一步可以跳過,不設定,直接調用ga。

% 根據需要設定,這裡我設定種群大小100,交叉機率0.8,疊代500次              options = gaoptimset('PopulationSize',100, 'CrossoverFraction', 0.8, 'Generations', 500);
           

第三步:調用ga()函數,計算出結果

調用函數之前,需要對ga函數傳入的參數進行設定。

由于本題沒有限制,僅對自變量x的取值作了限制,是以A,b,Aeq,beq均為空矩陣。

自變量x的限制為:

2021-04-26 Matlab遺傳算法工具箱的使用及執行個體(線性規劃)

是以

2021-04-26 Matlab遺傳算法工具箱的使用及執行個體(線性規劃)

由于本題沒有非線性的限制,是以用不上nonlcon參數,直接傳入空矩陣即可。

以上參數設定完,即可調用ga函數進行求解了。​​​​​​​

%% ga函數的參數設定              fun = @fitnessfun; % 設定适應度函數句柄,在定義的函數名前加個@即可              nvars = 2; % 自變量個數,本題為2個自變量              A = [];  b = [];               Aeq = [];  beq = []; % 沒有限制就指派為空矩陣              lb = [-5; -5];  ub = [5; 5];  % 對自變量x的限制              %% 調用ga函數計算              % 調用格式[x_best,fval] = ga(fun,nvars,A,b,Aeq,beq,lb,ub,nonlcon,options);               % fun是函數句柄, nvars變量數,A,b,Aeq,Beq是線性限制,lb,ub限制X範圍,              % nonlcon是非線性限制,做線性規劃尋優時指派為空即可。options是設定參數的結構體              [x_best, fval] = ga(fun, nvars, A,b,Aeq,beq,lb,ub,[],options);
           

整體代碼如下

得到fval的值為1,即為所求。

求下列函數的最小值

2021-04-26 Matlab遺傳算法工具箱的使用及執行個體(線性規劃)

第一步,編寫目标函數:​​​​​​​

function z = fitnessfun(x)              z = (x(2)-x(1).^2).^2 + (1-x(1)).^2 + (x(3) - x(2).^2).^2 + (1 - x(2)).^2;              end
           

第二步,調用ga函數進行求解​​​​​​​

運作代碼,得到fval的值約為2330.8681,即為所求。

注:由于遺傳算法具有一定的随機性,是以每次求解的結果可能有些許差别。

2021-04-26 Matlab遺傳算法工具箱的使用及執行個體(線性規劃)

繼續閱讀