Cleve's Corner:数学和计算上的Clyver

科学计算,数学和更多

美国旅游推销员巡回赛

找到通过美国48个连续状态的首都的最佳旅行推销局。

内容

国家首都

我继续使用工作空间我以前的博文

John Burkardt提供第二个数据集,endy_capitals_ll.txt.txt.,给出48个连续状态的资本的长度和纬度。(忽略AK,DC,HI,PR和我们。)

[lol,lat] = get_capital_coordinates;

当我在我之前的帖子中创建的图形使用这些坐标时,我们会获得更准确的美国的照片。

g =图表(a,cellstr(names));绘图(g,'xdata',lon,'ydata',拉特);

旅行

旅行推销员问题,TSP在数学上制定于19世纪。问题是找到传输最短总距离的城市列表的闭合电路。

25年来Matlab版本包括一个名为的简单演示程序旅行通过几十个随机选择的点找到TSP的近似解决方案。情节的背景是美国轮廓,只是为了艺术效果。

游客

我已经做了旅行演示进入一个名为的函数游客其输入是距离矩阵D.,城市之间的成对距离。输出是路径长度里程和排列载体P.以便里程是由此产生的路线的长度LON(P)拉特(P)

每次被称为,旅行从城市的随机排列开始。然后,对于几千次迭代,它试图通过修改两种简单方式中的每一个中的每一个来减少旅行的长度。一个方案是将一个城市移动到订购中的另一个位置。此示例从订单开始[1:7]。然后移动城市4.关注城市5.,所以订单变成了[1 2 3 5 4 6 7]。这减少了长度9.717.24

half_fig traveler_scheme1.

第二方案基于观察的观察,即任何时间路线交叉本身,可以通过反转交叉的段来减小长度。我们实际上没有寻找过境点,我们只是尝试扭转随机的排序块。这个例子逆转了[3 4 5][1:7]要得到[1 2 5 4 3 6 7],从而减少了长度9.477.65

Traveler_scheme2.

这两个启发式技术并不能够保证这一点游客将找到全球最短路径。很容易被困在当地的最小值。随机路径方法意味着游客超过几十个城市效率低下。

但没有人知道如何找到TSP和代码的保证最短路径游客只有58行。我将在此帖子结束时包含代码克利夫的实验室在Matlab中央文件交换。

关闭

距离矩阵

输入到游客是距离矩阵。

d =距离(LON,LOL);

对功能的输入距离是载体lon拉特,城市的经度和纬度。输出是48×48矩阵D., 这大圆圈距离在一对城市之间。用一些球面三角学,lon拉特基本上是以度的角度测量的角度,被转换为数英里,“当乌鸦飞行”的大地在地球表面上的长度。地球的半径是一个比例因子。这是该功能的核心。

dbtype.11:20距离..M.
11 r = 3959;地球的%半径(mi。)12 n =长度(lon);13d =零(n,n);14对于k = 1:n 15对于j = 1:k-1 16 d(k,j)= r * acos(sind(lat(k))* sind(lat(j))+ ... 17 cosd(LAT(k))* cosd(LAT(j))* cosd(lon(k)-lon(j)));18d(j,k)= d(k,j);19端20结束

极值

哪两个首都彼此最近?

dmin = min(min(d(d> 0)))[k,j] =查找(d == dmin)城市=名称(k)
Dmin = 34.9187 k = 37 19 j = 19 37个城市= 2×1字符串阵列“RI”“ma”

普罗维登斯,罗德岛和波士顿,马萨诸塞州(“我们的公平城市”)分开不到35英里。

另一个极端怎么样?

dmax = max(max(d))[k,j] = find(d == dmax)城市=名称(k)
dmax = 2.6629e + 03 k = 17 4 j = 4 17个城市= 2×1字符串数组“我”“CA”

我们可能预期的那样,缅因州和加利福尼亚州的首都是最远的,2663英里。这需要一个令人厌恶的乌鸦。

公路旅行

基于一些我很快描述的一些经验,我将要将随机数种子设置为347.在我们带我们的公路旅行之前游客

RNG(347)[Miles,P] =旅行者(D);英里=圆形(英里)
英里= 10818.

这是平均的

avg = miles / 48
avg = 225.3750.

每条腿里程。

强调

让我们突出邻近邻国的图表与我们的旅行推销员路径联系在一起。

gp = plot(g,'xdata',lon,'ydata',拉特,'Edgecolor',绿松石);亮点(GP,P,'Edgecolor',深红,'行宽',2)标题(英里)

有四个缺少的链接。路径从UT到MT,但这些状态不是邻居。我们必须经过身份证。从河流到sc的腿穿过ga。东北有两个更多。用虚线填写那些缺少的链接。

Missing_Links(A,Lon,Lat,P,Darked)

放大东北。

轴([ -  84 -68 33 46])

最终订单

在这里,由此路径命令的状态缩写。

FPRINTF(FMT,名称(P))
La TX OK NM AZ NV CA或WA ID MN WI MI OH WV PA NY VT ME NH MA RI CT NJ DE MD VA vA va va va tn va va v a nc va v a nc fl v v v a nc va tn ky在il ia ne ks mo ars la

最后一步

看看最后一步是有趣的。3298次迭代后,旅行到达这种情况,路径长度为10952。

将WV连接到VA的链路通过连接NC到PA的链路交叉。它需要旅行222更多迭代,但最终尝试了逆转VA和PA的路径的排列。这将WV与PA和NC连接到VA,以产生先前绘图中所示的路径。总路径长度降低134英里至10818。

最佳

我相信我们找到了最短的路径,但我没有证据。

我跑了1000种不同的初始化RNG.。八次运行产生了我们发现的长度10818的路径RNG(347)。没有任何运行发现了较短的路径。六个运行发现一个相当不同的路径,长度为10821,只有三英里长。这是这个下一个最好的路径。

动画片

我必须在这里包含一个动画的gif。这最初显示每第六步。当路径长度小于12000时,它会切换到每一步。随机路径中的几条腿匹配邻居图中的边缘,因此最初线条是虚线的。随着我们附近的,出现了更多的实线。

Traveler_game.

没有帮助,没有帮助,游客将发现48个资本城市的最短路线少于100。以下是您有机会帮助指导搜索。这Traveler_game.是一个修改旅行每个成功的步骤绘制,这提供了控制,以便您备份几步并再次尝试随机策略。

我将包括Traveler_game.在下次更新,版本3.70中克利夫的实验室在这一点Matlab中央文件Excange。这可能需要几天。

有五个按钮。

  • >采取一个最小化步骤。
  • >>采取重复步骤,直到达到局部最小值。
  • <反向一步。
  • <<反向很多步骤。
  • ^在一个新的数字窗口中重新开始。

这是四个典型的运行。

守则

以下是代码游客距离, 和路径长度

类型游客类型距离类型路径长度
功能[len,p] =旅行者(d)%旅行者旧MATLAB演示的功能形式,“旅行”。%一个非常好,但肯定不是最好的,解决%的旅行推销员问题。形成一个闭合电路的百分比,该城市的距离最短的总距离。%%[len,p] =旅行者(d)。%输入:d =带坐标x和y之间的城市之间的距离。%输出:p置换,x(p)和y(p)是一个长度Len的路径。%版权所有1984-2018 Mathworks,Inc. n =尺寸(d,1);p = randperm(n);len = path_length(p,d);对于iter = 1:10000%,尝试反转一部分。 pt1 = floor(n*rand)+1; pt2 = floor(n*rand)+1; lo = min(pt1,pt2); hi = max(pt1,pt2); q = 1:n; q(lo:hi) = q(hi:-1:lo); pnew = p(q); lennew = path_length(pnew,D); if lennew < len p = pnew; len = lennew; iterp = iter; end % Try a single point insertion pt1 = floor(n*rand)+1; pt2 = floor((n-1)*rand)+1; q = 1:n; q(pt1) = []; q = [q(1:pt2) pt1 q((pt2+1):(n-1))]; pnew = p(q); lennew = path_length(pnew,D); if lennew < len p = pnew; len = lennew; iterp = iter; end end % Close the permutation. p(end+1) = p(1); end function D = distances(lon,lat) % D = distances(lon,lay) % Input: vectors lon and lat, the longitude and latitude of the cities. % Output: D(k,j) is the distance (in miles) between cities k and j. % Copyright 1984-2018 The MathWorks, Inc. % Great circle distance matrix between pairs of cities. % https://en.wikipedia.org/wiki/Great-circle_distance. R = 3959; % radius of the earth (mi.) n = length(lon); D = zeros(n,n); for k = 1:n for j = 1:k-1 D(k,j) = R*acos(sind(lat(k))*sind(lat(j)) + ... cosd(lat(k))*cosd(lat(j))*cosd(lon(k)-lon(j))); D(j,k) = D(k,j); end end end function len = path_length(p,D) % len = path_length(p,D) % Calculate current path length for traveling salesman problem. % This function calculates the total length of the current path % p in the traveling salesman problem. % % This is a vectorized distance calculation. % % Create two vectors: p and q = p([n 1:(n-1)]). % The first is the list of first cities in any leg, and the second % is the list of destination cities for that same leg. % (the second vector is an element-shift-right version of the first) % % Use column indexing into D to create a vector of % lengths of each leg which can then be summed. n = length(p); q = p([n 1:(n-1)]); len = sum(D(q + (p-1)*n)); end




发布了MATLAB®R2018A

|

注释

要发表评论,请点击这里登录您的MathWorks帐户或创建新的。