蟻群演算法matlab
A. 蟻群演算法怎樣用MATLAB模擬
蟻群演算法採用matlab開發的模擬平台:演算法實現,路徑顯示,人機交互控制等
希望對你有幫助!
是可以運行的
% the procere of ant colony algorithm for VRP
%
% % % % % % % % % % %
%initialize the parameters of ant colony algorithms
load data.txt;
d=data(:,2:3);
g=data(:,4);
m=31; % 螞蟻數
alpha=1;
belta=4;% 決定tao和miu重要性的參數
lmda=0;
rou=0.9;%衰減系數
q0=0.95;
% 概率
tao0=1/(31*841.04);%初始信息素
Q=1;%螞蟻循環一周所釋放的信息素
defined_phrm=15.0; % initial pheromone level value
QV=100; % 車輛容量
vehicle_best=round(sum(g)/QV)+1;%所完成任務所需的最少車數
V=40;
% 計算兩點的距離
for i=1:32;
for j=1:32;
dist(i,j)=sqrt((d(i,1)-d(j,1))^2+(d(i,2)-d(j,2))^2);
end;
end;
%給tao miu賦初值
for i=1:32;
for j=1:32;
if i~=j;
%s(i,j)=dist(i,1)+dist(1,j)-dist(i,j);
tao(i,j)=defined_phrm;
miu(i,j)=1/dist(i,j);
end;
end;
end;
for k=1:32;
for k=1:32;
deltao(i,j)=0;
end;
end;
best_cost=10000;
for n_gen=1:50;
print_head(n_gen);
for i=1:m;
%best_solution=[];
print_head2(i);
sumload=0;
cur_pos(i)=1;
rn=randperm(32);
n=1;
nn=1;
part_sol(nn)=1;
%cost(n_gen,i)=0.0;
n_sol=0; % 由螞蟻產生的路徑數量
M_vehicle=500;
t=0; %最佳路徑數組的元素數為0
while sumload<=QV;
for k=1:length(rn);
if sumload+g(rn(k))<=QV;
gama(cur_pos(i),rn(k))=(sumload+g(rn(k)))/QV;
A(n)=rn(k);
n=n+1;
end;
end;
fid=fopen('out_customer.txt','a+');
fprintf(fid,'%s %i\t','the current position is:',cur_pos(i));
fprintf(fid,'\n%s','the possible customer set is:')
fprintf(fid,'\t%i\n',A);
fprintf(fid,'------------------------------\n');
fclose(fid);
p=compute_prob(A,cur_pos(i),tao,miu,alpha,belta,gama,lmda,i);
maxp=1e-8;
na=length(A);
for j=1:na;
if p(j)>maxp
maxp=p(j);
index_max=j;
end;
end;
old_pos=cur_pos(i);
if rand(1)<q0
cur_pos(i)=A(index_max);
else
krnd=randperm(na);
cur_pos(i)=A(krnd(1));
bbb=[old_pos cur_pos(i)];
ccc=[1 1];
if bbb==ccc;
cur_pos(i)=A(krnd(2));
end;
end;
tao(old_pos,cur_pos(i))=taolocalupdate(tao(old_pos,cur_pos(i)),rou,tao0);%對所經弧進行局部更新
sumload=sumload+g(cur_pos(i));
nn=nn+1;
part_sol(nn)=cur_pos(i);
temp_load=sumload;
if cur_pos(i)~=1;
rn=setdiff(rn,cur_pos(i));
n=1;
A=[];
end;
if cur_pos(i)==1; % 如果當前點為車場,將當前路徑中的已訪問用戶去掉後,開始產生新路徑
if setdiff(part_sol,1)~=[];
n_sol=n_sol+1; % 表示產生的路徑數,n_sol=1,2,3,..5,6...,超過5條對其費用加上車輛的派遣費用
fid=fopen('out_solution.txt','a+');
fprintf(fid,'%s%i%s','NO.',n_sol,'條路徑是:');
fprintf(fid,'%i ',part_sol);
fprintf(fid,'\n');
fprintf(fid,'%s','當前的用戶需求量是:');
fprintf(fid,'%i\n',temp_load);
fprintf(fid,'------------------------------\n');
fclose(fid);
% 對所得路徑進行路徑內3-opt優化
final_sol=exchange(part_sol);
for nt=1:length(final_sol); % 將所有產生的路徑傳給一個數組
temp(t+nt)=final_sol(nt);
end;
t=t+length(final_sol)-1;
sumload=0;
final_sol=setdiff(final_sol,1);
rn=setdiff(rn,final_sol);
part_sol=[];
final_sol=[];
nn=1;
part_sol(nn)=cur_pos(i);
A=[];
n=1;
end;
end;
if setdiff(rn,1)==[];% 產生最後一條終點不為1的路徑
n_sol=n_sol+1;
nl=length(part_sol);
part_sol(nl+1)=1;%將路徑的最後1位補1
% 對所得路徑進行路徑內3-opt優化
final_sol=exchange(part_sol);
for nt=1:length(final_sol); % 將所有產生的路徑傳給一個數組
temp(t+nt)=final_sol(nt);
end;
cost(n_gen,i)=cost_sol(temp,dist)+M_vehicle*(n_sol-vehicle_best); %計算由螞蟻i產生的路徑總長度
for ki=1:length(temp)-1;
deltao(temp(ki),temp(ki+1))=deltao(temp(ki),temp(ki+1))+Q/cost(n_gen,i);
end;
if cost(n_gen,i)<best_cost;
best_cost=cost(n_gen,i);
old_cost=best_cost;
best_gen=n_gen; % 產生最小費用的代數
best_ant=i; %產生最小費用的螞蟻
best_solution=temp;
end;
if i==m;%如果所有螞蟻均完成一次循環,,則用最佳費用所對應的路徑對弧進行整體更新
for ii=1:32;
for jj=1:32;
tao(ii,jj)=(1-rou)*tao(ii,jj);
end;
end;
for kk=1:length(best_solution)-1;
tao(best_solution(kk),best_solution(kk+1))=tao(best_solution(kk),best_solution(kk+1))+deltao(best_solution(kk),best_solution(kk+1));
end;
end;
fid=fopen('out_solution.txt','a+');
fprintf(fid,'%s%i%s','NO.',n_sol,'路徑是:');
fprintf(fid,'%i ',part_sol);
fprintf(fid,'\n');
fprintf(fid,'%s %i\n','當前的用戶需求量是:',temp_load);
fprintf(fid,'%s %f\n','總費用是:',cost(n_gen,i));
fprintf(fid,'------------------------------\n');
fprintf(fid,'%s\n','最終路徑是:');
fprintf(fid,'%i-',temp);
fprintf(fid,'\n');
fclose(fid);
temp=[];
break;
end;
end;
end;
end;
B. MATLAB 蟻群演算法求解TSP問題
n個城市,編號為1---n
for循環的次數是螞蟻重復城市的次數,比如5個螞蟻放到4個城市,需要重復兩遍才能放完螞蟻,每次循環產生n個1---n的隨機數,相當於隨機n個城市,產生城市序列
循環結束
Tabu一句表示將m個螞蟻隨機,每個螞蟻放到前面產生的城市序列中,每個螞蟻一個城市,需要m個,所以提取前面1:m個序列
'表示轉置,沒有多大用處,可能參與後面的計算方便。
我感覺如果m,n很大的話,你這樣做會產生很大的浪費,計算很多的隨機數,這樣的話更好,一句就得:(如果變數Randpos後面沒有用到的話,如果用到了,還要用你的程序)
Tabu=ceil(n*rand(1,m))'
C. matlab中蟻群演算法的個體適應度函數指的是什麼意思
蟻群演算法求最小距離航路,個體適應度函數指個體完成一條路線的距離值, 圖上看到最優值是在不斷進化減小的.
D. 急求蟻群演算法matlab工具箱,多謝了。
直接在命令窗口裡邊輸入gatool就行了,用遺傳演算法還可以使用ga函數,具體使用格式可以在help系統里看ga,你還可以按照如下步驟打開遺傳演算法工具箱:1,打開MATLAB,2點擊左下方的START按鈕 3,點toolboxes,打開後選擇Genetic Algorithm and Direct Search 然後就可以進入gatool了,然後就會彈出ga工具箱(註:我的版本是7.7的,不同版本可能不同),希望對你有用哈!
E. 螞蟻演算法 matlab 代碼
怎麼說呢。你提出問題也不詳細描述問題是什麼。難道所有會matlab代碼的人都知道什麼叫螞蟻演算法?難道我還得去搜索下什麼叫螞蟻演算法?
F. 螞蟻演算法的MATLAB實現
因為是專業論文,譯者不知是否准確。請你以專業方面的知識來修正。
Vehicle Routing was first studied in 1959 and soon attracted a rang of experts did researches in the operations research, management, computer applications, combinatorics, graph theory, etc. The findings have been widely used in the transport system, logistics and distribution system, express transceiver systems. This article will start from the vehicles in general, set up a mathematical model, introced the issue of Vehicle Routing in practical application and academic research proced a number of different extension and style changes. Focus on the extension study on business travels, and finally through the Ant algorithm, using MATLAB programming to solve practical problems to achieve the optimal route. Because Ant algorithm is of a search of the probability, the computation results are generally inclined to a convergence of values. Through multiple iterations experiment, it can obtain the Optimum Solution.
G. 急求蟻群演算法解決 VRPTW問題的matlab代碼,最好是ACS或者MMAS的!
function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q)
%%=========================================================================
%% ACATSP.m
%% Ant Colony Algorithm for Traveling Salesman Problem
%% ChengAihua,PLA Information Engineering University,ZhengZhou,China
%% Email:[email protected]
%% All rights reserved
%%-------------------------------------------------------------------------
%% 主要符號說明
%% C n個城市的坐標,n×2的矩陣
%% NC_max 最大迭代次數
%% m 螞蟻個數
%% Alpha 表徵信息素重要程度的參數
%% Beta 表徵啟發式因子重要程度的參數
%% Rho 信息素蒸發系數
%% Q 信息素增加強度系數
%% R_best 各代最佳路線
%% L_best 各代最佳路線的長度
%% 運行可能要很久,需要耐心等待
%%=========================================================================
n=length(C); %n 為市個數
for i=1:n %坐標矩陣轉換為距離矩陣
for j=1:n
D(i,j)=sqrt((x(i,1)-x(j,1))^2+(x(i,2)-x(j,2))^2);
end
end
for i=1:n %Eta為啟發因子,這里設為距離的倒數
for j=1:n %原文作者少考慮的當D=0是MATLAB提示出錯
if i~=j
Eta(i,j)=1./D(i,j);
end
end
end
for i=1:n
Eta(i,i)=0;
end
Tau=ones(n,n); %Tau為信息素矩陣
Tabu=zeros(m,n); %存儲並記錄路徑的生成
NC=1; %迭代計數器
R_best=zeros(NC_max,n); %各代最佳路線
L_best=inf.*ones(NC_max,1); %各代最佳路線的長度
L_ave=zeros(NC_max,1); %各代路線的平均長度
while NC<=NC_max %停止條件之一:達到最大迭代次數
%%第二步:將m只螞蟻放到n個城市上
Randpos=[];
for i=1:(ceil(m/n))
Randpos=[Randpos,randperm(n)];
end
Tabu(:,1)=(Randpos(1,1:m))';
%%第三步:m只螞蟻按概率函數選擇下一座城市,完成各自的周遊
for j=2:n
for i=1:m
visited=Tabu(i,1:(j-1)); %已訪問的城市
J=zeros(1,(n-j+1)); %待訪問的城市
P=J; %待訪問城市的選擇概率分布
Jc=1;
for k=1:n
if length(find(visited==k))==0
J(Jc)=k;
Jc=Jc+1;
end
end
%下面計算待選城市的概率分布
for k=1:length(J)
P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);
end
P=P/(sum(P));
%按概率原則選取下一個城市
Pcum=cumsum(P);
Select=find(Pcum>=rand);
to_visit=J(Select(1));
Tabu(i,j)=to_visit;
end
end
if NC>=2
Tabu(1,:)=R_best(NC-1,:);
end
%%第四步:記錄本次迭代最佳路線
L=zeros(m,1);
for i=1:m
R=Tabu(i,:);
for j=1:(n-1)
L(i)=L(i)+D(R(j),R(j+1));
end
L(i)=L(i)+D(R(1),R(n));
end
L_best(NC)=min(L);
pos=find(L==L_best(NC));
R_best(NC,:)=Tabu(pos(1),:);
L_ave(NC)=mean(L);
NC=NC+1;
%%第五步:更新信息素
Delta_Tau=zeros(n,n);
for i=1:m
for j=1:(n-1)
Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);
end
Delta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);
end
Tau=(1-Rho).*Tau+Delta_Tau;
%%第六步:禁忌表清零
Tabu=zeros(m,n);
end
%%第七步:輸出結果
Pos=find(L_best==min(L_best));
Shortest_Route=R_best(Pos(1),:);
Shortest_Length=L_best(Pos(1));
DrawRoute(C,Shortest_Route) %調用函數繪圖
H. 求蟻群演算法matlab或者,c,或者vb源碼,用在多機器人協作,尋跡,最有路徑的,,程序!!謝謝,回答好的,
clear,close all;
loc = [0.3663, 0.9076; 0.7459, 0.8713; 0.4521, 0.8465;
0.7624, 0.7459; 0.7096, 0.7228; 0.0710, 0.7426;
0.4224, 0.7129; 0.5908, 0.6931; 0.3201, 0.6403;
0.5974, 0.6436; 0.3630, 0.5908; 0.6700, 0.5908;
0.6172, 0.5495; 0.6667, 0.5446; 0.1980, 0.4686;
0.3498, 0.4488; 0.2673, 0.4274; 0.9439, 0.4208;
0.8218, 0.3795; 0.3729, 0.2690; 0.6073, 0.2640;
0.4158, 0.2475; 0.5990, 0.2261; 0.3927, 0.1947;
0.5347, 0.1898; 0.3960, 0.1320; 0.6287, 0.0842;
0.5000, 0.0396; 0.9802, 0.0182; 0.6832, 0.8515];
% loc=rand(50,2);
NumCity=length(loc);
for i = 1:NumCity,
for j = 1:NumCity,
distance(i, j) = norm(loc(i, :) - loc(j, :));
end
end
distance=distance+eye(NumCity).*eps;
%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
%^^^^^^^^^^^^^^^^^^ Initialize AC Parameters ^^^^^^^^^^^^^
% P: ant α β ρ η Q
% V: 31 1 5 0.1 1./distance 100
ant=31; a=1; b=5; p=0.1; E=1./distance; Q=100;
%^^^^^^^^^^^^
t=ones(NumCity); Nm=200;
Tabu=zeros(ant,NumCity); R_best=zeros(Nm,NumCity);
L_ave=zeros(Nm,1); L_best=inf.*ones(Nm,1);
%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
tic
for Nc=1:Nm
Tabu=[];
%^^^^^^^^^^^^^^^^^^ Put Ants into Cities ^^^^^^^^^^^^^
Randpos=[];
for i=1:(ceil(ant/NumCity)),Randpos=[Randpos,randperm(NumCity)];end
Tabu(:,1)=(Randpos(1,1:ant))';
%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
%^^^^^^^^^^^^ Ants According To Probability Choose Next City ^^^^^^^^^^^^^
for j=2:NumCity,
for i=1:ant,
VisitedCity=Tabu(i,1:(j-1));
UnVisited=zeros(1,(NumCity-j+1));
P=UnVisited;
Jc=1;
for k=1:NumCity
if length(find(VisitedCity==k))==0
UnVisited(Jc)=k;
Jc=Jc+1;
end
end
%^^^^^^^^^^^^
for k=1:length(UnVisited)
P(k)=(t(VisitedCity(end),UnVisited(k)).^a)...
*(E(VisitedCity(end),UnVisited(k)).^b);
end
P=P./sum(P);
%^^^^^^^^^^^^
Pcum=cumsum(P);
Select=find(Pcum>=rand);
% Select=find(P==max(P));
ToVisit=UnVisited(Select(1));
Tabu(i,j)=ToVisit;
end
end
if Nc>=2,Tabu(1,:)=R_best(Nc-1,:);end
%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
%^^^^^^^^^^^^ Record the Best Path ^^^^^^^^^^^^^
L=zeros(ant,1);
dt=zeros(NumCity);
for i=1:ant
R=Tabu(i,:);
for j=1:(NumCity-1), L(i)=L(i)+distance(R(j),R(j+1));end
L(i)=L(i)+distance(R(1),R(NumCity));
for j=1:(NumCity-1)
dt(Tabu(i,j),Tabu(i,j+1))=dt(Tabu(i,j),Tabu(i,j+1))+Q./(L(i));
end
dt(Tabu(i,NumCity),Tabu(i,1))=dt(Tabu(i,NumCity),Tabu(i,1))+Q./L(i);
end
L_best(Nc)=min(L);
pos=find(L==L_best(Nc));
R_best(Nc,:)=Tabu(pos(1),:);
L_ave(Nc)=mean(L);
t=(1-p).*t+dt;
%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
%^^^^^^^^^^^^ Updata the t ^^^^^^^^^^^^^
% dt=zeros(NumCity);
% for i=1:ant
% for j=1:NumCity-1
% dt(Tabu(i,j),Tabu(i,j+1))=dt(Tabu(i,j),Tabu(i,j+1))+Q./(L(i));
% end
% dt(Tabu(i,NumCity),Tabu(i,1))=dt(Tabu(i,NumCity),Tabu(i,1))+Q./L(i);
% end
% t=(1-p).*t+dt;
% Tabu=zeros(ant,NumCity);
end
toc
Pos=find(L_best==min(L_best));
Shortest_Route=R_best(Pos(1),:);
Shortest_Length=L_best(Pos(1));
subplot(1,2,1)
DrawRoute(loc,Shortest_Route)
subplot(1,2,2)
plot(L_best)
hold on
plot(L_ave)
I. 求助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).
J. 在網上下載一個關於蟻群演算法matlab程序,錯誤,求解
你的代碼里用到了保留關鍵字 function,這個是用於定義子函數的,你不能用它做其他用途(除非你是要定義子函數)。只需換個名字即可