【问题标题】:TSP solution interpretationTSP解决方案解读
【发布时间】:2015-06-14 16:38:25
【问题描述】:

这主要是一个咨询问题。

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

很明显,第一个程序(Prog# 1)的建议解决方案比第二个程序(Prog# 2)更有希望被优化; Prog# 2 的解决方案似乎很可能是随机解决方案。

但是我计算的Prog# 1 的成本是97314.36,Prog# 2 的成本是74635.31这比Prog# 1 的解决方案成本几乎20K 小,并且成本表明Prog# 2 找到的解决方案应该比第一个解决方案优化得多.

问题

1) 为什么Prog# 2 找到的解的路径图不支持(视觉上)计算的成本值?

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中的代码相同

ofstream out(jconfig["output-file"].as_string());
for(int i = 0; i < p->lchrom; i++) {
    city c = data.at(best_found->chrom[i]);
    out<<c.x<<" "<<c.y<<endl;
}
out.close();

【问题讨论】:

  • 你算什么意思。您确定哪一个:可视化,或成本,或两者都不是。
  • 成本只是点到点欧式距离的总和,但可视化和成本之间应该有一些合理的关系。我在Prog# 2 的可视化中没有看到这一点。
  • 另外我认为这不是一个很好的问题,因为 1) 的答案是:因为可视化或绘图仪中存在错误。而且您显示的代码是用于打印数据的 2x c++ sn-ps,除了它们输出两列数据之外没有任何说明(可能存在大量问题,但我怀疑是否有任何输出看起来合理且程序没有崩溃),以及一个未指定的绘图脚本。您将其标记为 c++ 并且您展示的 c++ 代码绝对无助于解决您的问题。所以很难判断你是否错过了什么。
  • 我使用 matlab/octave 进行绘图,所以我认为他们的绘图中没有错误 :) 并且超出我发送的 sn-p C++ 代码只是遗传算法与输出结果无关
  • 我想到了成本的含义。也很明显应该有关系。但是你说你计算了这个值。我非常怀疑您计算了约 100 个距离。您在距离计算或可视化/绘图中有错误。是什么让你认为 Prog#1 有关系,也许应该是 50k?我怀疑他们的情节中存在错误。从tsp_plot_output 中完成的绘图和距离计算。我敢打赌你那里有虫子。如果它是八度音阶,也许您应该用octave 标签询问您的脚本是否按照您的想法执行。我不够好=)

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


【解决方案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)。 我还更改了norm 中x 的顺序。当然你的没有错,但是这样很明显你将向量从当前点 k 带到下一个点 k+1 而不是另一个方向。

【讨论】:

  • +1 你是对的!!想知道我是怎么得出这个明显的错误的!我在修复成本函数的情况下再次运行我的程序,需要一两个小时才能完成,我会就结果与您联系。
  • 是的,这就是问题所在,新结果证实了这一点,干杯:)
猜你喜欢
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多