當前位置:編程學習大全網 - 腳本源碼 - 在matlab中如何用遺傳算法求極值

在matlab中如何用遺傳算法求極值

matlab有遺傳算法工具箱。

核心函數:

(1)function [pop]=initializega(num,bounds,eevalFN,eevalOps,options)--初始種群的生成函數

輸出參數

pop--生成的初始種群

輸入參數

num--種群中的個體數目

bounds--代表變量的上下界的矩陣

eevalFN--適應度函數

eevalOps--傳遞給適應度函數的參數

options--選擇編碼形式(浮點編碼或是二進制編碼)[precision F_or_B],如

precision--變量進行二進制編碼時指定的精度

F_or_B--為1時選擇浮點編碼,否則為二進制編碼,由precision指定精度)

(2)function [x,endPop,bPop,traceInfo] = ga(bounds,evalFN,evalOps,startPop,opts,...

termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps)--遺傳算法函數

輸出參數

x--求得的最優解

endPop--最終得到的種群

bPop--最優種群的壹個搜索軌跡

輸入參數

bounds--代表變量上下界的矩陣

evalFN--適應度函數

evalOps--傳遞給適應度函數的參數

startPop-初始種群

opts[epsilon prob_ops display]--opts(1:2)等同於initializega的options參數,第三個參數控制是否輸出,壹般為0。如[1e-6 1 0]

termFN--終止函數的名稱,如['maxGenTerm']

termOps--傳遞個終止函數的參數,如[100]

selectFN--選擇函數的名稱,如['normGeomSelect']

selectOps--傳遞個選擇函數的參數,如[0.08]

xOverFNs--交叉函數名稱表,以空格分開,如['arithXover heuristicXover simpleXover']

xOverOps--傳遞給交叉函數的參數表,如[2 0;2 3;2 0]

mutFNs--變異函數表,如['boundaryMutation multiNonUnifMutation nonUnifMutation unifMutation']

mutOps--傳遞給交叉函數的參數表,如[4 0 0;6 100 3;4 100 3;4 0 0]

註意matlab工具箱函數必須放在工作目錄下

問題求f(x)=x+10*sin(5x)+7*cos(4x)的最大值,其中0<=x<=9

分析選擇二進制編碼,種群中的個體數目為10,二進制編碼長度為20,交叉概率為0.95,變異概率為0.08

程序清單

%編寫目標函數

function[sol,eval]=fitness(sol,options)

x=sol(1);

eval=x+10*sin(5*x)+7*cos(4*x);

%把上述函數存儲為fitness.m文件並放在工作目錄下

initPop=initializega(10,[0 9],'fitness');%生成初始種群,大小為10

[x endPop,bPop,trace]=ga([0 9],'fitness',[],initPop,[1e-6 1 1],'maxGenTerm',25,'normGeomSelect',...

[0.08],['arithXover'],[2],'nonUnifMutation',[2 25 3]) %25次遺傳叠代

運算借過為:x =

7.8562 24.8553(當x為7.8562時,f(x)取最大值24.8553)

註:遺傳算法壹般用來取得近似最優解,而不是最優解。

遺傳算法實例2

問題在-5<=Xi<=5,i=1,2區間內,求解

f(x1,x2)=-20*exp(-0.2*sqrt(0.5*(x1.^2+x2.^2)))-exp(0.5*(cos(2*pi*x1)+cos(2*pi*x2)))+22.71282的最小值。

分析種群大小10,最大代數1000,變異率0.1,交叉率0.3

程序清單

%源函數的matlab代碼

function [eval]=f(sol)

numv=size(sol,2);

x=sol(1:numv);

eval=-20*exp(-0.2*sqrt(sum(x.^2)/numv)))-exp(sum(cos(2*pi*x))/numv)+22.71282;

%適應度函數的matlab代碼

function [sol,eval]=fitness(sol,options)

numv=size(sol,2)-1;

x=sol(1:numv);

eval=f(x);

eval=-eval;

%遺傳算法的matlab代碼

bounds=ones(2,1)*[-5 5];

[p,endPop,bestSols,trace]=ga(bounds,'fitness')

註:前兩個文件存儲為m文件並放在工作目錄下,運行結果為

p =

0.0000 -0.0000 0.0055

大家可以直接繪出f(x)的圖形來大概看看f(x)的最值是多少,也可是使用優化函數來驗證。matlab命令行執行命令:

fplot('x+10*sin(5*x)+7*cos(4*x)',[0,9])

evalops是傳遞給適應度函數的參數,opts是二進制編碼的精度,termops是選擇maxGenTerm結束函數時傳遞個maxGenTerm的參數,即遺傳代數。xoverops是傳遞給交叉函數的參數。mutops是傳遞給變異函數的參數。

  • 上一篇:梅婷片場大口吃飯被偷拍,她有什麽好的影視作品?
  • 下一篇:請問北京西客站有幫忙搬運行李的嗎?我是指從下火車到出站的這壹段路?
  • copyright 2024編程學習大全網