這個程式能正常作用.他取點的方式為亂數產生,有沒辦法改成為自己設定呢!?
還有蟻群的矩陣一定要用方陣才可以嗎?可改成非方陣嗎?
%蟻周模型,解決TSP問題
%clc
%初始化
format short;
d=[11,2,5;7,8,7;8,6,3];
n=length(d); %n 城市數目
m=5; %m 螞蟻數量
Nmax=100;%最大循環次數
%d(i,j) 城市i,j之間的距離,d is a nn matrix
y=zeros(n,n);%y(i,j)=1/d(i,j) 在TSP問題中,啟發信息
for i=1:n
for j=1:n
y(i,j)=1/d(i,j);
end
end
e=1;%信息啟發因子
f=1;%期望啟發因子
Q=20;%
S=ones(n,n);%(i,j)路段初始化起始信息素
for i=1:n
for j=1:n
S(i,i)=0;
end
end
S1=zeros(n,n);%(i,j)路段信息素增量
notallowed=ones(m,n);%禁忌表,0表示已經訪問過
a=zeros(m,n);%螞蟻循環一次的路徑
for k=1:m
a(k,1)=1+round(rand(n-1));%將螞蟻隨機放到n個城市上
end
for k=1:m % 將初始城市放入禁忌表中
notallowed(k,a(k,1))=0;
end
for N=1:Nmax %N 循環次數
t=2;
L=zeros(1,m);
while t<=n %重複直至禁忌表滿為止
for k=1:m
%計算螞蟻k轉移的概率
i=a(k,t-1);
p=zeros(1,n);%p(j)螞蟻k選擇路徑i,j的概率
for j=1:n
if notallowed(k,j)~=0
u=(S(i,j)^e)(y(i,j)^f);
v=0;
for w=1:n
v=v+(S(i,w)^e)(y(i,w)^f)*notallowed(k,w);
end
if v~=0
p(j)=u/v;
end
end
end
[pk,j]=max(p);
notallowed(k,j)=0;
L(k)=L(k)+d(i,j);
a(k,t)=j;
end
t=t+1;
end
for k=1:m
L(k)=L(k)+d(a(k,n),a(k,1));
end
%一次循環結束,回到起始位置
%更新
for k=1:m
for i=1:n-1
end
end
for i=1:n
for j=1:n
if d(i,j)~=inf
for k=1:m
end
end
end
end
for i=1:n
for j=1:n
if d(i,j)~=inf
S(i,j)=(1-rand)*S(i,j)+S1(i,j);
end
end
end
for k=1:m %將禁忌表中除起始城市,全都置為未訪問
for t=1:n
if t~=a(k,1)
notallowed(k,t)=1;
end
end
end
S1=zeros(n,n);%(i,j)路段信息素增量清零
end %循環最大次數結束
[result,k]=min(L)
a(k,