蚁群算法解决ATT48问题(matlab)
function = ACO(city, varargin) %(city, Niteration, use prebuilt pheromone, batch mode)tic
%load att48.txt city;
global NC distan phe a b
NC = size(city, 1); % 城市个数
distan = zeros(NC); % store the distance between citys
bestr = logical(zeros(1, NC)); % 用来记录最优路径
if nargin >= 2
M = varargin{1};
else
M = 1; % 最大循环次数
end
if nargin >= 3
phe = varargin{2};
rlength = inf;
else
phe = ones(NC, NC); % 初始时刻各边上的信息量为1
rlength = inf; % 用来记录当前找到的最优路径长度
end
evap = 0.2; % 挥发系数 0.2 ?
a = 1; % a = 1 ?
b = 2;
Q = 33000; % length is 33062
Qt = 1000;
ants = 20; % 蚂蚁数量
for i = 1: NC % 计算各城市间的距离
for j = 1: NC
distan(i, j) = sqrt((city(i, 2) - city(j, 2)) ^2 + (city(i, 3) - city(j, 3)) ^2);
end
end
for ite = 1 : M
for k = 1 : ants %考查第K只蚂蚁
nphe = zeros(NC, NC); % 第K只蚂蚁移动前各边上的信息增量为零
= travel();
if lengthk < rlength % 找到一条更好的路径
rlength = lengthk;
bestr = routek;
end
for i = 1 : NC - 1 % 第K只蚂蚁在路径上释放的信息量
nphe(routek(i), routek(i + 1)) = nphe(routek(i), routek(i + 1)) + (exp(Qt / (lengthk - Q))) * 0.4 / ants; %%%
end
nphe(routek(NC), 1) = nphe(routek(NC), 1) + (exp(Qt / (lengthk - Q))) * 0.4 / ants; %%%
end
for i = 1 : NC - 1
for j = i + 1 : NC
if nphe(i, j) == 0
nphe(i, j) = nphe(j, i);
end
end
end
phe = (1 - evap) .* phe + nphe;
end
rlength
if nargin < 4
toc
end
%%% travel
function = travel() % 某只蚂蚁找到的某条路径
global NC distan phe a b cp
p = fix(NC * rand) + 1;
val = 0; % 初始路径长度设为 0
isin = logical(zeros(1, NC)); % mark visited city
tabuk = int8(zeros(1, NC)); % used to store the route
tabuk(1) = p; % 该蚂蚁都从第 p 个城市出发的
isin(p) = true;
n = 1;
for i = 1 : NC - 1
cp = zeros(1, NC); % 转移概率
np = tabuk(n); % 蚂蚁当前所在的城市号
p_sum = 0; % to calc pheromone sum
for j = 1 : NC
if isin(j) ~= true
ada=1 / distan(np, j);
cp(j) = phe(np, j) ^ a * ada ^ b;
p_sum = p_sum + cp(j);
end
end
cp = cp ./ p_sum;
NextCity = pchoice();
n = n + 1;
isin(NextCity) = true;
tabuk(n) = NextCity;
val = val + distan(np, NextCity);
end
val = val + distan(tabuk(1), tabuk(NC));
%%% pchoice
function NextCity = pchoice() % choose the next city
global NC cp
tempR = rand(1, NC);
R2 = rand + 0.5;
tempR = (tempR + R2) .* cp;
= max(tempR);
注:各种参数,包括信息量的增加 等应该怎么弄,有规则吗? 我这个程序只能达到3.54, 而最优的都3.3呢。 我晕!!!!!!!!!!!!1 。。。。。。。。。。。 这个程序到底时求什么的呀,我有点看不懂呀,还有假设城市之间的距离不是坐标图而是距离图,那在编程的时候应该怎么做呀 蚁群算法的大致原理我已经看过好多遍了的,但是就是在编程的时候卡住了,卖友办法,在建模的时候就卡住了,毕竟我在编程方面时菜鸟,能不能具体的帮我弄一下呀,原题时98年数学建模题目,安排灾情巡视路线的那个题目,谢谢 怎么论坛里都没有关于具体算法的例子和程序代码,这样学习起来不是很方面呢,对于我们这些初学者而言 1# fantimond
运行不了!验证完毕! 想请问下蚁群算法att48之类是在哪里下载?谢谢,如果方便能不能发给我一份?chengketty@163.com。太感谢了! wotoudoudalea …………………………
页:
[1]
2