2021-04-26 Matlab遗传算法工具箱的使用及实例(线性规划)
Matlab遺傳算法工具箱的使用及實例(線性規劃)
引言
在使用遺傳算法(Genetic Algorithm,GA)之前,你得了解遺傳算法是干什么的。遺傳算法一般用于求解優化問題。遺傳算法最早是由美國的 John holland于20世紀70年代提出,該算法是根據大自然中生物體進化規律而設計提出的。是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模擬自然進化過程搜索最優解的方法。該算法通過數學的方式,利用計算機仿真運算,將問題的求解過程轉換成類似生物進化中的染色體基因的交叉、變異等過程。在求解較為復雜的組合優化問題時,相對一些常規的優化算法,通常能夠較快地獲得較好的優化結果。
?
遺傳算法的原理和具體流程,各大書籍資料都有,這里不再贅述。我相信來找工具箱的人對原理有所了解。我們在使用工具箱時,不需要理解他的原理,因為這些已經封裝到工具箱里了,你只需要設定參數即可。我將結合線性規劃、非線性規劃兩類問題,來介紹一下MATLAB遺傳算法工具箱的使用。本文先介紹用遺傳算法工具箱求解線性規劃模型,非線性規劃見下期。
線性規劃的標準形式
在使用遺傳算法求解線性規劃問題的時候,需要將模型描述成標準線性規劃的形式。
?
標準線性規劃
標準線性規劃使用矩陣的形式表示如下:
是自變量列向量,若有三個自變量,即為(x1,x2,x3)'
min f(x)是目標函數;
A是小于約束中x的系數矩陣,b是小于約束常數項的列向量;
Aeq是等號約束中x的系數矩陣,beq是等號約束中的常數項的列向量;
lb是x的最小取值,ub是x的最大取值
?
非標準線性規劃轉化為標準線性規劃的實例
對于非標準線性規劃的形式,如何化為標準型的線性規劃呢?下面通過一個例子來說.
例如:有以下線性規劃問題:
可以觀察到,標準型的目標函數是求極小值,而這個案例的目標函數是極大值,我們可以在目標函數f(x)添加一個負號,改為求-f(x),根據中學數學知識可以知道,-f(x)的最小值,就是f(x)的最大值.
在約束條件中,標準型的不等式約束都是小于約束,而案例中出現了大于約束。根據中學知識,不等式的兩邊同時乘一個負數,不等號改變方向。因此,我們只需要在不等式兩邊同時乘-1即可.
?
而 x1,x,2,x3>=0是對于自變量定義域的限制。
?
因此,上述模型可以轉化為:
根據線性代數的知識,約束條件的方程/不等式組可以用矩陣形式表示:
式[1]是等號約束,可表示為Aeq*x=beq的形式:
式[2][3]是小于號的約束,可表示為A*x<=b的形式:
式[4]是自變量的取值范圍,可表示為lb<=x<=ub的形式
?
遺傳算法工具箱的使用說明
MATLAB提供的遺傳算法工具箱,主要分為兩個函數:gaoptimset()函數和ga()函數,gaoptimset()函數是用于設置遺傳算法的一些參數的,可以不設置。若不設置,就使用默認參數。ga()函數是調用遺傳算法對優化問題進行計算。
?
設置遺傳算法參數——gaoptimset()函數的使用
?
調用格式為:?
- ?
其中,'Param1'、'Param2'等是需要設定的參數,比如:種群規模、交叉比例等。value1、value2等則是Param的具體值。常用的參數名如下表(只列出了常用的,還有很多參數可以調整,可自行上網搜索):
?
gaoptimset函數的常用選項
?
例如,需要設置交叉比例為0.7、迭代次數為300、種群規模為30
- ?
返回的options是結構體,用于ga函數的最后一個參數
?
遺傳算法——ga()函數的使用
?
ga函數的調用格式為:
?
- ?
?
在做約束條件為線性的模型時,參數nonlcon直接傳入空矩陣即可,代表不使用。
返回值x_best為取到最小值時的自變量x的取值,fval為所求的最小值。
實例
?
求下列函數的極小值:
第一步:把目標函數編寫成函數的形式,便于調用(將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的限制為:
因此
?
由于本題沒有非線性的約束,因此用不上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);整體代碼如下
clearclc% 設置種群大小100,交叉概率0.8,最大進化代數500options = gaoptimset('PopulationSize',100, 'CrossoverFraction', 0.8, 'Generations', 500); fun = @fitnessfun; % 設置適應度函數句柄,在定義的函數名前加個@即可nvars = 2; % 自變量個數,本題為2個自變量A = []; b = []; Aeq = []; beq = []; % 沒有約束就賦值為空矩陣lb = [-5;-5]; ub = [5;5]; % 對自變量x的限制[x_best, fval] = ga(fun, nvars, A,b,Aeq,beq,lb,ub,[],options); function z = fitnessfun(x) z = 2-exp(-(x(1).^2+x(2).^2));end得到fval的值為1,即為所求。
?
求下列函數的最小值
?
?
第一步,編寫目標函數:???????
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函數進行求解???????
fun = @fitnessfun; % 設置適應度函數句柄nvars = 3; % 自變量個數A = [-10,-20,-1;1,2,4]; b = [-100;40]; % A·x <= b約束Aeq = [9,6,1]; beq = [100]; % Aeq·x <= beq約束lb = [2;2;2]; ub = [10;10;10]; % 定義域lb <= x <= ub[x_best, fval] = ga(fun, nvars, A,b,Aeq,beq,lb,ub,[],[]);運行代碼,得到fval的值約為2330.8681,即為所求。
?
注:由于遺傳算法具有一定的隨機性,因此每次求解的結果可能有些許差別。
總結
以上是生活随笔為你收集整理的2021-04-26 Matlab遗传算法工具箱的使用及实例(线性规划)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [css] 如何使用css显示a链接的
- 下一篇: [css] 说出至少十条你理解的css