【问题标题】:Need some help on this representation of Traveling Salesman Problem需要一些关于旅行推销员问题的表示的帮助
【发布时间】:2010-11-29 17:29:07
【问题描述】:

我遇到了一个使用 Matlab 脚本的旅行推销员解决方案,在它的代码中,我发现它使用了一种称为城市坐标的表示,它看起来像:

CityCood = [0.4000,0.2439,0.1707,0.2239,0.5171;0.4439,0.1463,0.2293,0.7610,0.9414]

5 个城市。

在这一点上,我真的不知道作者是如何得到这个表示的,因为从我目前看到的情况来看,手头的信息应该是一个 5*5 对称矩阵,表示这五个城市中任意两个城市之间的距离.

因此,如果有人能告诉我基于坐标的表示是如何工作的,我将不胜感激。提前致谢。

【问题讨论】:

  • 考虑对变量名使用驼峰式大小写:cityCoord 而不是 CityCoord

标签: algorithm data-structures matlab neural-network traveling-salesman


【解决方案1】:

CityCoord(我认为缺少一个字母)是一个 2×5 数组。我假设这意味着CityCoord 包含每个城市的两个坐标 (x,y)。

要创建一个 5×5 距离矩阵,您可以调用

squareform(pdist(CityCoord'))

【讨论】:

  • 太棒了。如果我手头已经有一个距离矩阵怎么办?比如说,我知道 A、B、C、D、E 5 个城市中每一对的城际距离?
  • @Robert:如果您需要将距离矩阵转换为坐标,并且您有统计工具箱,您可以使用例如mdscale,如CityCoord = mdscale(distanceMatrix,2)';
  • 没有统计工具箱的人的 IPDM:mathworks.com/matlabcentral/fileexchange/18937
  • 在文档中实际上有一个使用 CMDSCALE 根据城市间距离重建(近似)位置的示例:mathworks.com/help/toolbox/stats/briu08r-1.html#briu08r-4
【解决方案2】:

如果您没有统计工具箱,@Jonas 提供的用于计算欧几里德距离的解决方案的等效形式是:

%# dist(u,v) = norm(u-v) = sqrt(sum((u-v).^2))
D = cell2mat( arrayfun( ...
    @(i) sqrt( sum( bsxfun(@minus, CityCoord, CityCoord(:,i)).^2 ) ), ...
    (1:size(CityCood,2))', ...
    'UniformOutput',false) );

否则,我们可以使用||u-v||^2 = ||u||^2 + ||v||^2 - 2*u.v 来实现更快的向量化代码:

X = sum(CityCoord.^2);
D = real( sqrt(bsxfun(@plus,X,X')-2*(CityCoord'*CityCoord)) );

【讨论】:

  • +1 表示漂亮和高级,尽管非工具箱解决方案有点难以阅读!
  • 为了便于阅读,我尝试将其分解为多行,但调用 PDIST 仍然容易得多 :)
猜你喜欢
  • 2017-11-11
  • 2011-02-02
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多