資源簡介
基于matlab程序語言的蟻群算法求解函數(shù)最優(yōu)值,供廣大科研工作者和程序愛好者學(xué)習(xí)使用參考!

代碼片段和文件信息
function?[maxValuemaxXMVMX]=ant_funname_max(funnameXYAntTimesRouP0)
%?利用蟻群算法求函數(shù)的極值
%?input?????funname:優(yōu)化函數(shù)的函數(shù)句柄
%???????????XY:搜索范圍即[x1x2y1y2z1z2]
%???????????Ant:螞蟻數(shù)量
%???????????Times:螞蟻移動次數(shù)
%???????????Rou:信息素揮發(fā)系數(shù)
%???????????P0:轉(zhuǎn)移概率
%?output????maxValue:函數(shù)極大值
%???????????maxX:函數(shù)極大值對應(yīng)的自變量取值
%???????????MV:每一代函數(shù)的極大值
%???????????MX:每一代函數(shù)極大值對應(yīng)的自變量取值
%?example:
%?funname=@CNOT_search;
%?XY=[1.8782.8781.8782.8780.010.0650.010.065];????????????????????????%自變量取值范圍??????????????????
%?Ant=300;??????????????????????????%?螞蟻數(shù)量
%?Times=80;?????????????????????????%?螞蟻移動次數(shù)
%?Rou=0.9;??????????????????????????%?信息素揮發(fā)系數(shù)
%?P0=0.2;???????????????????????????%?轉(zhuǎn)移概率常數(shù)
%?[maxValuemaxXMVMX]=ant_funname_max(funnameXYAntTimesRouP0);
%?隨機設(shè)置螞蟻的初始位置
Lower=XY(1:2:end-1);
Upper=XY(2:2:end);
UL=Upper-Lower;
X=repmat(LowerAnt1)+repmat(ULAnt1).*rand(Antlength(Lower));
Tau=search_value(Xfunname);
%?初始螞蟻位置的分布圖(僅限自變量為一維和二維的)
if?abs(length(Lower)-2)<1e-4
????figure;
????[xy]=meshgrid(linspace(Lower(1)Upper(1)100)linspace(Lower(2)Upper(2)100));
????for?m=1:size(x1)
????????for?n=1:size(x2)
????????????z(mn)=search_value([x(mn)y(mn)]funname);
????????end
????end
????subplot(121);
????mesh(xyz);
????hold?on;
????plot3(X(:1)X(:2)Tau‘k*‘);
????hold?on
????title(‘螞蟻的初始分布位置‘);
????xlabel(‘x‘);
????ylabel(‘y‘);
????zlabel(‘z‘);
????xlim([XY(1)XY(2)]);
????ylim([XY(3)XY(4)]);
elseif?abs(length(Lower)-1)<1e-4
????x=linspace(Lower(1)Upper(1)100);
????for?m=1:length(x)
????????y(m)=search_value(x(m)funname);
????end
????subplot(121);
????plot(xy);
????hold?on;
????plot(XTau‘k*‘);
????hold?on
????title(‘螞蟻的初始分布位置‘);
????xlabel(‘x‘);
????ylabel(‘y‘);
????xlim([XY(1)XY(2)]);
end
%?存儲每一代的最佳值
MX=zeros(Timeslength(Lower));
MV=zeros(Times1);
%?迭代尋找最佳值
for?T=1:Times
????lamda=1/T;
????[Tau_Best(T)BestIndex]=max(Tau);
????%計算狀態(tài)轉(zhuǎn)移概率
????P(:T)=(Tau(BestIndex)-Tau)/Tau(BestIndex);
????for?i=1:Ant
????????if?P(iT) ????????????%局部搜索
????????????temp=X(i:)+(2*rand(1length(Lower))-1)*lamda;
????????else
????????????%全局搜索
????????????temp=X(i:)+UL.*(2*rand(1length(Lower))-1);
????????end
????????%越界處理
????????p1=find(temp ????????temp(p1)=Lower(p1);
????????p2=find(temp>Upper);
????????temp(p2)=Upper(p2);
????????%判斷螞蟻是否移動
????????if?search_value(tempfunname)>search_value(X(i:)funname)
????????????X(i:)=temp;
????????end
????end
????%更新信息量
????for?i=1:Ant
????????Tau(i)=(1-Rou)*Tau(i)+search_value(X(i:)funname);
????end
????%存儲每一代的最佳值
????[max_valuemax_index]=max(Tau);
????maxX=X(max_index:);
????maxValue=search_value(maxXfunname);
????MX(T:)=maxX;
????MV(T)=maxValue;
end
%?結(jié)果顯示
[max_valuemax_index]=max(MV);
maxX=MX(max_index:);
maxValue=max_value;
disp([‘函數(shù)最大值對應(yīng)的自變量取值:‘]);
disp(maxX);
disp([‘函數(shù)最大值:‘]);
disp(maxValue);
%?結(jié)束時螞蟻的位置分布(僅限自變量是一維和二維的)
if?abs(length(Lower)-2)<1e-4
????subplot(
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2018-12-15?23:06??蟻群算法求函數(shù)最值\
?????文件????????4201??2017-10-21?21:50??蟻群算法求函數(shù)最值\ant_fun_con_max.m
?????文件????????4193??2017-10-21?21:50??蟻群算法求函數(shù)最值\ant_fun_con_min.m
?????文件????????3647??2017-10-21?21:50??蟻群算法求函數(shù)最值\ant_fun_max.m
?????文件????????3641??2018-04-25?22:58??蟻群算法求函數(shù)最值\ant_fun_min.m
?????文件????????4158??2017-10-21?21:50??蟻群算法求函數(shù)最值\ant_funname_max.m
?????文件????????4111??2017-10-21?21:50??蟻群算法求函數(shù)最值\ant_funname_min.m
?????文件????????3371??2018-04-26?18:29??蟻群算法求函數(shù)最值\ant_min.m
?????文件????????2948??2018-03-21?14:53??蟻群算法求函數(shù)最值\example_fun.m
?????文件?????????748??2018-03-09?13:48??蟻群算法求函數(shù)最值\example_funname.m
?????文件?????????558??2017-10-21?21:50??蟻群算法求函數(shù)最值\produce.m
?????文件????????6948??2017-10-21?21:50??蟻群算法求函數(shù)最值\trial_function_test.m
- 上一篇:編隊控制仿真程序
- 下一篇:基于擴展卡爾曼濾波的電池soc估計simuli
nk模型
評論
共有 條評論