蟻羣算法求函數最大值一

這裏使用蟻羣算法求函數的最大值,函數是:

f = -(x.^4 + 3*y.^4 - 0.2*cos(3*pi*x) - 0.4*cos(4*pi*y) + 0.6);

步驟如下:

  1. 初始化參數。
  2. 初始化蟻羣,第一代蟻羣隨機分佈在可行域中。
  3. 初始化信息素,第一代信息素採用第一代蟻羣的函數值表示,函數值越大,信息素越多。
  4. 狀態轉移,計算狀態轉移概率,根據狀態轉移概率進行局部搜索或全局搜索。
  5. 約束邊界。
  6. 選擇,根據目標函數值在原始蟻羣和狀態轉移之後的蟻羣之間進行選擇。
  7. 更新信息素,tau = (1 – Rou) .* tau + calObjFun(ants)。
  8. 對選擇後的蟻羣重複進行狀態轉移、約束邊界和更新信息素3步,直至結束。

主函數及結果

下面是主函數:

clear;

clc;

Ant = 300; % 螞蟻數量

Times = 80; % 螞蟻移動次數

Rho = 0.9; % 信息素揮發係數

P0 = 0.2; % 轉移概率常數

xl = -1; xu = 1; % 設置搜索範圍

yl= -1; yu = 1;

step= 0.05;

ants = initant(Ant, xl, xu, yl, yu); % 初始化蟻羣

tau = calObjFun(ants); % 計算初代信息素

firstants= ants;

fort = 1:Times

ants = edgeselection(ants,P0, tau, 1/t, xl, xu, yl, yu); % 轉移+約束

tau = (1 - Rho) .* tau +calObjFun(ants); % 更新信息素

end

figure(1);

plotobjfun(xl,xu, yl, yu, step);

holdon;

plot3(firstants(:,1),firstants(:,2), calObjFun(firstants), 'b*');

holdon;

plot3(ants(:,1),ants(:,2), calObjFun(ants), 'r*');

holdoff;

程序運行結果繪圖如下,其中藍色點爲第一代蟻羣,紅色爲最後一代蟻羣:

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