TSP解决方案解读

时间:2015-04-09 10:45:32

标签: c++ algorithm matlab octave genetic-algorithm

  

这主要是一个咨询问题。

我已经开发了一种遗传算法来解决TSP,长话短说,我已经写了两个不同的代码,我使用this作为我的数据集。程序找到的解决方案如下所示。

prog#1 solution

prog#2 solution

很明显,第一个程序( Prog# 1 )的建议解决方案比第二个程序( Prog# 2 )更有前途待优化;并且来自Prog# 2的解决方案似乎是最有可能的随机解决方案。

我计算的Prog# 1费用是 97314.36 ,而Prog# 2的费用是 { {1}} 74635.31的解决方案成本差不多 20K ,并且成本表明Prog# 1找到解决方案应该BE 比第一个解决方案更优化。

问题

1)为什么Prog# 2找到的解决方案的路径图不支持(直观地)计算出的成本值?

2)考虑到打击脚本,有什么我错过的吗?


为了完整性,我发布了用于绘制和计算成本值的脚本。

Prog# 2

我在function tsp_plot_output() close all; disp('loading data....'); x=load('out.res'); dist = 0; for i=1:2:size(x, 1)-1 dist = dist + norm(x(i,:) - x(i+1,:), 2); end dist = dist + norm(x(1,:) - x(end,:), 2); fprintf('COST IS: %.2f\n', dist); disp('ploting data....'); xx = x(:,1); xy = x(1:size(xx, 1),2); zxx = x(:,1); zxy = x(1:size(zxx),2); plot(xx, xy), title('Found TSP solution'); hold plot(zxx, zxy, 'r.'); end 中用来倒出解决方案的代码是

Prog# 1

std::ofstream os(outputfile); BOOST_FOREACH(size_t city, *best->_genes) { auto loc = _data->get(city); os<<loc.longitude<<" "<<loc.latitude<<endl; } os.close();

中的相同代码
Prog# 2

1 个答案:

答案 0 :(得分:1)

您的MATLAB距离计算错误。你有:

dist = 0;
for i=1:2:size(x, 1)-1
    dist = dist + norm(x(i,:) - x(i+1,:), 2);
end
dist = dist + norm(x(1,:) - x(end,:), 2);

使用for i=1:2:size(x,1)-1,您从i=1开始,然后在每个步骤中添加2,直至到达size(x,1)-1。因此,您可以添加距离1-2,然后距离3-4的距离,依此类推。当然应该是1-2,然后是2-3,依此类推。这是通过

实现的
dist = 0;
for k=1:size(x,1)-1
    dist = dist + norm(x(k+1,:) - x(k,:),2);
end
dist = dist + norm(x(end,:) - x(1,:),2);

对于示例x = [0,0; 1,1; 1,0],旧例程返回2.4142,而更正的例程返回正确的sqrt(2) + 1 + 1 = 3.4142

PS:我将运行变量更改为k,因为在MATLAB i中代表虚构单元(有关详细信息,请参阅this question)。 我还更改了xnorm的顺序。当然你的错不错,但是很明显你把矢量从当前点k带到下一个点k+1而不是另一个方向。