這是蟻群程式碼我要丟入labview的mathscript裡面計算.可是mathscript無法計算有function的程式碼.
希望大大可以幫我修改成沒有function的程式碼.
function [bestroute,routelength]=Ant
clc
clear
tic
% 讀入城市間距離矩陣數據文件
CooCity = [1,2,5;2,5,4;9,7,1;1,6,4;2,3,7]
NC=length(CooCity); % 城市個數
for i=1:NC % 計算各城市間的距離
for j=1:NC
distance(i,j)=sqrt((CooCity(i,2)-CooCity(j,2))^2+(CooCity(i,3)-CooCity(j,3))^2);
end
end
%distance=xlsread('DistanceCity.xls'); % 城市間距離矩陣數據文件,excel形式給出
MAXIT=100; % 最大循環次數
Citystart=[1]; % 起點城市編號為空陣
tau=ones(NC,NC); % 初始時刻各邊上的信息痕跡為1
rho=0.3; % 揮發係數
alpha=1; % 殘留信息相對重要度
beta=5; % 預見值的相對重要度
Q=10; % 信息素強度
NumAnt=20; % 螞蟻數量
bestroute=zeros(1,32); % 用來記錄最優路徑
save output.txt bestroute -ASCII -TABS;
routelength=inf; % 用來記錄當前找到的最優路徑長度
for n=1:MAXIT %循環次數
for k=1:NumAnt %考查第K只螞蟻
deltatau=zeros(NC,NC); % 第K只螞蟻移動前各邊上的信息增量為零
% [routek,lengthk]=path(distance,tau,alpha,beta,[]); % 不靠率起始點
[routek,lengthk]=path(distance,tau,alpha,beta,Citystart); % 指定起始點
if lengthk<routelength % 找到一條更好的路徑
routelength=lengthk;
bestroute=routek;
end
for i=1:NC-1 % 第K只螞蟻在路徑上釋放的信息量
deltatau(routek(i),routek(i+1))=deltatau(routek(i),routek(i+1))+Q/lengthk; % 信息素更新
end
deltatau(routek(NC),1)=deltatau(routek(NC),1)+Q/lengthk; %
end
length_n(n)=routelength; % 記錄路徑收斂
tau=(1-rho).*tau+rho.*deltatau; % 信息素揮發,更新後的信息素
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
costtime=toc;
subplot(1,2,1),plot([CooCity(bestroute,2)],[CooCity(bestroute,3)],'-*')
subplot(1,2,2),plot([1:MAXIT],length_n,'-*')
[routelength,costtime]
% 某只螞蟻找到的某條路徑routek,lengthk
function [routek,lengthk]=path(distance,tau,alpha,beta,Citystart)
[m,n]=size(distance);
if isempty(Citystart) % 如果不確定起點
p=fix(m*rand)+1; % 隨機方式初始化起點,均勻概率
else
p=Citystart; % 外部給定確定起點
end
lengthk=0; % 初始路徑長度設為 0
routek=
; % 螞蟻路徑點序列,即該螞蟻已經過的城市集合,路徑初始起點
for i=1:m-1
np=routek(end); % 螞蟻路徑城市序號,依次經過的城市編號
np_sum=0; % 路由長度初始為 0
for j=1:m
if inroute(j,routek)
% 判斷城市節點j是否屬於tabuk,即是否已經過
continue;
else % j為還未經過的點,對
ada=1/distance(np,j); % 預見度
np_sum=np_sum+tau(np,j)^alpha*ada^beta; % 路由表:信息痕跡、預見度
end
end
cp=zeros(1,m); % 轉移概率,基於路徑長度及路由表
for j=1:m
% if any(routek==8) break;%
if inroute(j,routek)
continue;
else
ada=1/distance(np,j); % 預見度
cp(j)=tau(np,j)^alpha*ada^beta/np_sum; % np到j的轉移概率
end
end
NextCity=nextcitychoose(cp); % 根據轉移概率確定下一個城市,
% 這裡採用不同的隨機決策原則所得效果也不同:
% nextcitychoose3 取轉移概率最大值方向
% nextcitychoose和nextcitychoose2 轉移概率累積序列大於某隨機值方向
% 直觀地,取轉移概率最大值方向方法,決策結果穩定且收斂快
routek=[routek,NextCity]; % 更新路徑
lengthk=lengthk+distance(np,NextCity); % 更新路徑長度
end
% % ?為何不直接以轉移概率最大值對應節點為下一轉移節點
% 隨機決策原則確定下步轉移節點, 轉移概率累積序列大於某隨機值方向
function N=nextcitychoose(Cp)
a=rand;
s=0;
for i=1:length(Cp)
s=s+Cp(i);
if a<=s
N=i;
break;
end
end
function Y=inroute(n,A)
% A 為已過城市點集合,如果n在A中返回1
Y=0;
for i=1:length(A)
if A(i)==n
Y=1;
break;
end
end