蛮力方法和并发线程之间的选择

时间:2011-01-08 06:50:18

标签: java graph traveling-salesman

我有一个关于图表的问题。考虑具有节点和边的图,每个边都有成本。问题是访问所有节点,以便遍历的边缘成本总和最小(我猜是旅行商问题)。

您会推荐哪种方法?通过递归或使用强力方法通过产生线程来同时移动不同的路径并计算它们的成本。

或者你有更好的方法来解决这个问题吗?

4 个答案:

答案 0 :(得分:2)

TSP是NP难的。见维基百科。它可怕地扩展。 在4核上进行多线程处理可以使其速度提高4倍, 这与100,1000或1000000倍相比没有什么变得更慢 当你尝试一个稍大的问题。 只需尝试使用真实大小的数据,就可能需要数年才能完成。

一个解决方案是元启发式,有几个库,  比如Drools Planner(开源,java)。 看看它的TTP示例。

答案 1 :(得分:1)

递归更简单,因为它是强力的,多线程不能保证更快地为您提供解决方案。但在重新发明轮子之前,请查看Concorde TSP Solver:

http://www.tsp.gatech.edu/concorde/index.html

免费下载并包含来源。

答案 2 :(得分:0)

我会选择多线程方法,因为它会并行执行。作为一个额外的优化,我还会在一些共享变量中保持完整路径的最低成本,并让每个线程检查该成本 - 如果在遍历之间它们超过该成本,我将立即终止处理。

答案 3 :(得分:0)

由于我不知道你为什么这样做,也不知道你的约束是什么,我投票支持单线程递归。这更容易。