❶ 求助Matlab蟻群演算法求一般函數極值的演算法
function [ROUTES,PL,Tau]=ACASP(G,Tau,K,M,S,E,Alpha,Beta,Rho,Q)
%% ---------------------------------------------------------------
% ACASP.m
% 蟻群演算法動態尋路演算法
% ChengAihua,PLA Information Engineering University,ZhengZhou,China
% Email:[email protected]
% All rights reserved
%% ---------------------------------------------------------------
% 輸入參數列表
% G 地形圖為01矩陣,如果為1表示障礙物
% Tau 初始信息素矩陣(認為前面的覓食活動中有殘留的信息素)
% K 迭代次數(指螞蟻出動多少波)
% M 螞蟻個數(每一波螞蟻有多少個)
% S 起始點(最短路徑的起始點)
% E 終止點(最短路徑的目的點)
% Alpha 表徵信息素重要程度的參數
% Beta 表徵啟發式因子重要程度的參數
% Rho 信息素蒸發系數
% Q 信息素增加強度系數
%
% 輸出參數列表
% ROUTES 每一代的每一隻螞蟻的爬行路線
% PL 每一代的每一隻螞蟻的爬行路線長度
% Tau 輸出動態修正過的信息素
%% --------------------變數初始化----------------------------------
%load
D=G2D(G);
N=size(D,1);%N表示問題的規模(象素個數)
MM=size(G,1);
a=1;%小方格象素的邊長
Ex=a*(mod(E,MM)-0.5);%終止點橫坐標
if Ex==-0.5
Ex=MM-0.5;
end
Ey=a*(MM+0.5-ceil(E/MM));%終止點縱坐標
Eta=zeros(1,N);%啟發式信息,取為至目標點的直線距離的倒數
%下面構造啟發式信息矩陣
for i=1:N
if ix==-0.5
ix=MM-0.5;
end
iy=a*(MM+0.5-ceil(i/MM));
if i~=E
Eta(1,i)=1/((ix-Ex)^2+(iy-Ey)^2)^0.5;
else
Eta(1,i)=100;
end
end
ROUTES=cell(K,M);%用細胞結構存儲每一代的每一隻螞蟻的爬行路線
PL=zeros(K,M);%用矩陣存儲每一代的每一隻螞蟻的爬行路線長度
%% -----------啟動K輪螞蟻覓食活動,每輪派出M只螞蟻--------------------
for k=1:K
disp(k);
for m=1:M
%% 第一步:狀態初始化
W=S;%當前節點初始化為起始點
Path=S;%爬行路線初始化
PLkm=0;%爬行路線長度初始化
TABUkm=ones(1,N);%禁忌表初始化
TABUkm(S)=0;%已經在初始點了,因此要排除
DD=D;%鄰接矩陣初始化
%% 第二步:下一步可以前往的節點
DW=DD(W,:);
DW1=find(DW
for j=1:length(DW1)
if TABUkm(DW1(j))==0
DW(j)=inf;
end
end
LJD=find(DW
Len_LJD=length(LJD);%可選節點的個數
%% 覓食停止條件:螞蟻未遇到食物或者陷入死胡同
while W~=E&&Len_LJD>=1
%% 第三步:轉輪賭法選擇下一步怎麼走
PP=zeros(1,Len_LJD);
for i=1:Len_LJD
PP(i)=(Tau(W,LJD(i))^Alpha)*(Eta(LJD(i))^Beta);
end
PP=PP/(sum(PP));%建立概率分布
Pcum=cumsum(PP);
Select=find(Pcum>=rand);
%% 第四步:狀態更新和記錄
Path=[Path,to_visit];%路徑增加
PLkm=PLkm+DD(W,to_visit);%路徑長度增加
W=to_visit;%螞蟻移到下一個節點
for kk=1:N
if TABUkm(kk)==0
DD(W,kk)=inf;
DD(kk,W)=inf;
end
end
TABUkm(W)=0;%已訪問過的節點從禁忌表中刪除
for j=1:length(DW1)
if TABUkm(DW1(j))==0
DW(j)=inf;
end
end
LJD=find(DW
Len_LJD=length(LJD);%可選節點的個數
end
%% 第五步:記下每一代每一隻螞蟻的覓食路線和路線長度
ROUTES{k,m}=Path;
if Path(end)==E
PL(k,m)=PLkm;
else
PL(k,m)=inf;
end
end
%% 第六步:更新信息素
Delta_Tau=zeros(N,N);%更新量初始化
for m=1:M
if PL(k,m) ROUT=ROUTES{k,m};
TS=length(ROUT)-1;%跳數
PL_km=PL(k,m);
for s=1:TS
x=ROUT(s);
Delta_Tau(y,x)=Delta_Tau(y,x)+Q/PL_km;
end
end
end
Tau=(1-Rho).
❷ 蟻群演算法求函數的最小值
未定義鏈告函數或變數 'max_global'神含。
出錯 ant_main_program (line 107)
if max_local(i_ger) > max_global(i_ger-1)
怎游喚笑么解決
❸ 用蟻群演算法求函數f(x,y)=+-((x2++y-+1)+(x+y3-+-7)2)+/200+10
蟻群演算法是一種基於模擬螞蟻在尋找食物過程中的行為模式來求解優化問題的演算法。對於這個函數f(x,y)=±((x2+y±1)+(x+y3±7)2)/200+10,我們可以利用蟻群演算法來求其最小值,具體步驟如下:
初始化一組螞蟻,並隨機生成一個二元組 (x,y)作鍵神銀為起始點。
設置蟻群演算法的一些參數,如迭代次數,最大和最小信息素濃度,信息素揮發因子等。
對於每隻螞蟻,計算其在當前位置 (x,y)下能夠走到的所有可能的鄰居點,並根據一定的策略(如輪盤賭選擇法)選擇下一個稿宴要到達的點。
更新每隻螞蟻所經過的路徑信息素濃度,使其與走過的路徑長度成反比關系。
更新全局最優解,記錄當前所有螞蟻中走過路徑 f(x,y) 最小的那一個。
更新信息素濃度,增加路徑瞎嘩 f(x,y) 對信息素濃度的影響,同時根據一定的規則揮發部分信息素。
判斷是否滿足停止條件(如迭代次數或全局最優解的精度已經達到預設值),如果未滿足,則回到第3步,否則輸出全局最優解。
需要注意的是,由於本函數存在兩個算符可以取正或者取負,不同的取值會導致函數的最小值位置出現變化。因此需要對全局最優解進行記錄,對於每個算符取值進行多次螞蟻搜索,最終得到兩種情況下的最小值,並進行比較。
❹ 蟻群演算法求函數最大值
這里使用蟻群演算法求函數的最大值,函數是:
步驟如下:
下面是主函數:
程序運行結果繪圖如下,其中藍色點為第一代蟻群,紅色為最後一代蟻群:
函數說明如下:
下面計算函數的狀態轉移概率,進行局部搜索和全局搜索:
之後約束邊界:
最後進行選擇:
初始化蟻群函數:
計算目標函數值函數:
繪制函數圖像函數: