遺傳算法(四)MATLAB GA工具箱使用 附解TSP問題

基本使用

1. 直接參見函數ga

函數原型:[x fval] = ga(@fitnessfun, nvars, options)

x是使fitnessfun函數取最小值使的自變量值。nvars爲自變量的數目即x向量中包含的元素個數,option可暫時不填。

[x, f] = ga(@cos, 1);

即得到一段簡單的遺傳算法代碼,其作用爲求解某函數的最小值。

如何調參

x = ga(fitnessfcn,nvars,A,b,Aeq,beq,LB,UB,nonlcon,IntCon,options)
  • A, b,Aep, beq, LB, UB爲線性約束項,即滿足如下約束:

AxbAeqxbeqLBxUB
  • nonlcon爲非線性約束nonlenear constraints。其中運用了矢量化約束(Vectorized Constraints)的方法。nonlcon是一個返回兩個參數的函數句柄,可以是當前路徑下的一個函數文件@functionfile。其具有如下原型:
    [c ceq] = nonlcon(x)

其約束爲c0 , ceq=0 。舉個例子(來自MATLAB help,直接截圖):
具有三個變量的規劃中,有非線性約束:

constraints

則其向量化約束函數nonlcon可以寫爲:
conscode

  • IntCon:自變量向量正整數的下標,從1到nvars.

  • options: 比較複雜,感興趣的讀者可以去查一下幫助文檔。在這裏舉例用幾個比較常用的option:

選項 功能
CrossoverFraction 交叉的概率 0-1的小數
EliteCount 用於精英原則,
每次遺傳中一定會活下來的個體的個數
正整數
FitnessLimit 適應度的範圍 標量/ {-Inf}
Generations 迭代遺傳的次數 正整數
InitialPopulation 初始種羣 可以用上一次遺傳生成的種羣
作爲下一次GA的初始種羣

option中的功能要通過gaoptimset('param1',value1,'param2',value2,...)的形式調用

再調用一個簡單的GA代碼作結:

[x, f] = ga(@cos, 1, [], [], [], [], 0, 2 * pi, [], gaoptimset('CrossoverFraction', 0.3))

示例,解組合優化

1. 解TSP

由於MATLAB提供了很好的遺傳算法接口,故對於用戶來說只需要將問題抽象化,再進行編碼、解碼、計算適應度即可。

問題例子可以參考上一篇文章: 遺傳算法(三)解TSP問題

這裏直接給出適應度計算函數,包含編碼和解碼:

function Fitness = GA_TSPfun(chrom)
%% Create City
NumCity = 9;
Fitness = 0;
Dist =[0 2.8946 6.5107 5.5845 5.2429 5.8733 4.4377 2.7627 6.5644;
 2.8946 0 4.3313 5.1381 5.7211 3.1830 2.3729 5.2763 5.0574;
 6.5107 4.3313 0 3.6548 5.2943 1.8590 2.0889 9.2412 8.3103;
 5.5845 5.1381 3.6548 0 1.7362 4.8792 3.3486 8.190210.1465;
 5.2429 5.7211 5.2943 1.7362 0 6.2723 4.5224 7.531710.7633;
 5.8733 3.1830 1.8590 4.8792 6.2723 0 1.8705 8.4338 6.4969;
 4.4377 2.3729 2.0889 3.3486 4.5224 1.8705 0 7.1555 6.9906;
 2.7627 5.2763 9.2412 8.1902 7.5317 8.4338 7.1555 0 7.1508;
 6.5644 5.0574 8.310310.146510.7633 6.4969 6.9906 7.15080];

%% Decode:
order = [];
city = 1 : NumCity;
for j = 1 : NumCity 
    order = [order, city(1+rem( chrom(j)-1, length(city)))];
    city(1 + rem(chrom(j)-1, length(city))) = [];
end
for i = 1 : NumCity
    city1 = order(i);
    city2 = order(1 + rem(i, NumCity));
    Fitness = Fitness + Dist((city1-1)*NumCity + city2);
end
end

經驗證發現,同樣的TSP問題,MATLAB的GAtools得出的解大多爲31.7, 33左右,逼近最優解。但是前一篇中作者自己編寫的遺傳算法程序,得出的平均結果爲40左右。可見自己寫的代碼爬山能力還不夠強,挖個坑,以後再研究一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章