SA解决TSP问题的程序

转载 2004年08月03日 19:37:00
发信人: lonelyu (小鱼儿◎大海的方向), 信区: AI
标  题: Re: 谁有模拟退火的程序
发信站: 饮水思源 (2002年01月21日21:46:45 星期一), 站内信件

发信站: BBS 水木清华站 (Wed May 16 11:36:04 2001)
这是SA解决TSP问题的程序。
function out = tsp(loc)
% TSP Traveling salesman problem (TSP) using SA (simulated annealing).
%      TSP by itself will generate 20 cities within a unit cube and
%      then use SA to slove this problem.
%
%      TSP(LOC) solve the traveling salesman problem with cities'
%      coordinates given by LOC, which is an M by 2 matrix and M is
%      the number of cities.
%
%      For example:
%
%              loc = rand(50, 2);
%              tsp(loc);
if nargin == 0,
% The following data is from the post by Jennifer Myers (jmyers@nwu.
edu)
edu)
% to comp.ai.neural-nets. It's obtained from the figure in
% Hopfield & Tank's 1985 paper in Biological Cybernetics
% (Vol 52, pp. 141-152).
        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];
end
NumCity = length(loc);          % Number of cities
distance = zeros(NumCity);      % Initialize a distance matrix
% Fill the distance matrix
for i = 1:NumCity,
        for j = 1:NumCity,
                distance(i, j) = norm(loc(i, :) - loc(j, :));
                distance(i, j) = norm(loc(i, :) - loc(j, :));
        end
end
% To generate energy (objective function) from path
%path = randperm(NumCity);
%energy = sum(distance((path-1)*NumCity + [path(2:NumCity) path(1)]));
% Find typical values of dE
count = 20;
all_dE = zeros(count, 1);
for i = 1:count
        path = randperm(NumCity);
        energy = sum(distance((path-1)*NumCity + [path(2:NumCity)
path(1)]));
        new_path = path;
        index = round(rand(2,1)*NumCity+.5);
        inversion_index = (min(index):max(index));
        new_path(inversion_index) = fliplr(path(inversion_index));
        all_dE(i) = abs(energy - ...
                sum(sum(diff(loc([new_path new_path(1)],:))'.^2)));
end
dE = max(all_dE);
dE = max(all_dE);
temp = 10*dE;  % Choose the temperature to be large enough
fprintf('Initial energy = %f/n/n',energy);
% Initial plots
out = [path path(1)];
plot(loc(out(:), 1), loc(out(:), 2),'r.', 'Markersize', 20);
axis square; hold on
h = plot(loc(out(:), 1), loc(out(:), 2)); hold off
MaxTrialN = NumCity*100;              % Max. # of trials at a
temperature
MaxAcceptN = NumCity*10;             % Max. # of acceptances at a
temperature
StopTolerance = 0.005;           % Stopping tolerance
TempRatio = 0.5;                % Temperature decrease ratio
minE = inf;                     % Initial value for min. energy
maxE = -1;                     % Initial value for max. energy
% Major annealing loop
while (maxE - minE)/maxE > StopTolerance,
        minE = inf;
        minE = inf;
        maxE = 0;
        TrialN = 0;             % Number of trial moves
        AcceptN = 0;           % Number of actual moves
        while TrialN < MaxTrialN & AcceptN < MaxAcceptN,
                new_path = path;
                index = round(rand(2,1)*NumCity+.5);
                inversion_index = (min(index):max(index));
                new_path(inversion_index) =
fliplr(path(inversion_index));
                new_energy = sum(distance( ...
                        (new_path-1)*NumCity+[new_path(2:NumCity)
new_path(1)]));
                if rand < exp((energy - new_energy)/temp),      % 
accept
 it!
                        energy = new_energy;
                        path = new_path;
                        minE = min(minE, energy);
                        maxE = max(maxE, energy);
                        AcceptN = AcceptN + 1;
                end
                TrialN = TrialN + 1;
        end
        end
        % Update plot
        out = [path path(1)];
        set(h, 'xdata', loc(out(:), 1), 'ydata', loc(out(:), 2));
        drawnow;
        % Print information in command window
        fprintf('temp. = %f/n', temp);
        tmp = sprintf('%d ',path);
        fprintf('path = %s/n', tmp);
        fprintf('energy = %f/n', energy);
        fprintf('[minE maxE] = [%f %f]/n', minE, maxE);
        fprintf('[AcceptN TrialN] = [%d %d]/n/n', AcceptN, TrialN);
        % Lower the temperature
        temp = temp*TempRatio;
end
% Print sequential numbers in the graphic window
for i = 1:NumCity,
        text(loc(path(i),1)+0.01, loc(path(i),2)+0.01, int2str(i), ...
                'fontsize', 8);
end
这个程序是.m文件,在matlab中运行。
【 在 killtime (小小虾) 的大作中提到: 】
: 谁有模拟退火算法求解TSP问题的源程序(最好是C语言的),发给我
: 一份,小弟不胜感激!


--
磨刀中。。。。。。

sa求解tsp问题MATLAB代码

  • 2009年12月17日 21:50
  • 4KB
  • 下载

TSP_旅行商问题 - 模拟退火算法(三)

本文基于模拟退火算法,实现了TSP问题的求解,并与蛮力法(DFS)进行比较,综合分析了模拟退火算法的优缺点!此外,本人还整理其他解决TSP问题的算法(蛮力法,动态规划,遗传算法,粒子群算法,人工神经网...
  • Houchaoqun_XMU
  • Houchaoqun_XMU
  • 2017年01月20日 17:47
  • 4714

使用蚁群算法(ACO)、遗传算法(GA)、霍普菲尔德网络(Hopfield)解决旅行商问题(TSP)

在研究生《人工智能》课堂上学习了蚁群算法之后,老师提出了可以解决旅行商问题的三种思路,分别通过神经网络计算、进化计算和群智能计算得到最佳途径。...
  • u013751160
  • u013751160
  • 2017年03月23日 16:58
  • 2922

粒子群(PSO)解决TSP问题

粒子群算法也称粒子群优化算法,简称PSO(Partical Swarm Optimization)。 以下是求解TSP问题的源码:#include #include #include #inc...
  • qithon
  • qithon
  • 2016年03月28日 22:21
  • 2567

遗传算法解决TSP问题(C++)

#include #include #include #include #include #include #include #include #include #include using nam...
  • scutwjh
  • scutwjh
  • 2014年12月10日 19:43
  • 1917

遗传算法解决tsp问题

本文主要介绍遗传算法的一些基本思想,主要是代码思想方面的,并不用于考试....在我的资源中可以找到一份课件(并不是我们学校的,是老师给的,我们貌似并不开这门课) 另外会在下一篇附上用遗传算法解决tsp...
  • fengsigaoju
  • fengsigaoju
  • 2016年02月29日 00:04
  • 1117

在人工智能中对TSP问题的求解

相信学过算法的童鞋都听说过一个很经典的问题:TSP问题,这个问题是NP问题,无法在多项式时间内进行求解。当问题规模较小时,还可以用穷举的方法进行求解,但是当城市一旦变多,穷举的时间将会指数级增加。就算...
  • jj12345jj198999
  • jj12345jj198999
  • 2013年01月10日 21:49
  • 2256

TSP_旅行商问题 - 遗传算法(四)

本文基于遗传算法的思想解决旅行商问题,满足了时间复杂度可接受,而且又不会陷入局部最优。本文首先简要介绍了遗传算法(GA)以及核心思想,此外,还给出具体实现程序的具体数据结构(最后提供本文的完整的代码以...
  • Houchaoqun_XMU
  • Houchaoqun_XMU
  • 2017年01月22日 12:54
  • 6527

用遗传算法求解TSP问题

原文链接: http://zh.5long.me/2015/genetic-algorithm-on-tsp/遗传算法简介关于遗传算法,首先看一段维基百科的解释: 遗传算法是模仿自然界生物进化机制...
  • taonull
  • taonull
  • 2015年05月25日 17:58
  • 5631

回溯法求解TSP问题

/* * @file TSP.cpp * @brief solve TSP with Backtrack's way * @author/Univ. taoxia...
  • plu_mik
  • plu_mik
  • 2014年12月18日 14:01
  • 2185
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SA解决TSP问题的程序
举报原因:
原因补充:

(最多只允许输入30个字)