遺傳演算法解決單變數函式值得優化問題
阿新 • • 發佈:2019-01-04
最近稍微學習一下智慧演算法的設計,就滿Internet搜尋,最終發現遺傳演算法是大家學習最多的,也是在各個領域內進行函式優化,解析解求解過程中很重要的一種方法!
學習遺傳演算法,首先為了上手較快,我推薦大家先使用Matlab,這個工具進行矩陣分析有應用,真的很管用,而且上手特別快!
http://baike.soso.com/v100038.htm 這個網頁上面有很詳細的關於遺傳只能演算法的講解,內容很詳細,是我們學習的好幫手!希望對這個演算法不是很熟悉的同學,要好好了解一下這個背景!
個人理解:其實簡單的來說,就是使用一個種有效的編碼方式,將有效空間中的解集,按照編碼方式排布,在代價函式的作用下,不斷的有目的的迭代,去尋找最後解,當然這是把這個問題給簡化好多!這幾其中自然包括如何去選擇,如何去進化,如何避免區域性最優解,對於種群進化來說應該如何避免種群的進化速度,如何去交叉!如何尋找到一個比較好的代價函式!
簡單的一元函式的優化:
y = sin(10*pi*x)/x 1<=x<=2
引數的設定:
種群大小:40
最大遺傳代數:20
個體長度:20
代溝:0.95
交叉遺傳:0.7
變異概率:0.01
lb=1;ub=2;
ezplot('sin(10*pi*X)/X',[lb,ub]);
xlabel('自變數/X')
ylabel('函式值/y')
建立一個初始的種群,並用十進位制數進行標示,便於計算
trace = zeros(2,MAXGEN);
FieldD = [PRECI;lb;ub;1;0;1;1];
Chrom = crtbp(NIND,PRECI);
gen = 0;
X = bs2rv(Chrom,FieldD);
代價函式:
ObjV = sin(10*pi*X)./X;
下面是主要的迭代過程:
while gen < MAXGEN FitnV = ranking(ObjV); Selch = select('sus',Chrom,FitnV,GGAP); Selch = recombin('xovsp',Selch,px); Selch = mut(Selch,pm); X = bs2rv(Selch,FieldD); ObjvSel = sin(10*pi*X)./X; [Chrom,ObjV] = reins(Chrom,Selch,1,1,ObjV,ObjvSel); X = bs2rv(Chrom,FieldD); gen = gen + 1; [Y,I] = min(ObjV); trace(1,gen) = X(I); trace(2,gen) = Y; end
還有就是一些圖片的顯示工作!這個對於有matlab基礎的同學來說是很easy的事情!在這個方向有什麼要的建議我們一起討論!