1. 程式人生 > >遺傳演算法解決單變數函式值得優化問題

遺傳演算法解決單變數函式值得優化問題

      最近稍微學習一下智慧演算法的設計,就滿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的事情!在這個方向有什麼要的建議我們一起討論!