- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我很清楚旅行商问题的 DP 解决方案;也称为 TSP 的 Held 和 Karp 算法。
我用位掩码实现了它,它是这样的:
int TSP(int pos, int bitmask) {
if (bitmask == (1<<(K+1))-1)
return dist[pos][0]; // Completing the round trip
if (memo[pos][bitmask] != -1)
return memo[pos][bitmask];
int answer = INF;
for (int i = 0; i <= K; i++) {
if (i != pos && (bitmask & (1 << i)) == 0)
answer = Math.min(answer, dist[pos][i] + TSP(i, bitmask | (1 << i)));
}
return memo[pos][bitmask] = answer; // Storing the best dist for the set of traveled cities and untraveled ones.
这个算法相当快; 15个城市的计算速度相对足够快。但是,我注意到它可以进一步改进以容纳大约 20 个城市。
1)如果dist矩阵是对称的,或许我们可以利用这个特性来避免重复计算。 (例如 a->b->c->d->a == a->d->c->b->a)
2) 同时使用上限和下限进行修剪。上述算法能够在很短的时间内得到第一个可能的最优解,也许可以用。
我尝试根据上述两个原则改进算法。但是,我没有得到更好的算法。
我是否在徒劳地尝试改进不可能完成的事情?你怎么认为?
最佳答案
我认为你是对的。在你的方法下,最大的城市数可能是20,21或者22,但是连25都不可能。这是因为你的算法里面status的个数是n*(2^n),当n=20的时候,大概是10个^7,当n=25时,大约是10^9,这是一个很大的数字。使用现代计算机,它可以在 1 秒内处理大约 10^7 个计算。但是处理 10^9 的计算大约需要 100 秒。
所以我认为如果想处理更多的城市,一些近似算法可能会有用,比如模拟退火算法、遗传算法等。或者你可以使用多台机器并缩小问题的规模。
关于java - 具有 Held 和 Karp 算法的旅行商,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19618938/
我正在使用Timelines,并希望将一些KeyPress事件连接到舞台,这些事件可以改变时间线在其运行过程中更改属性的方式. 我知道如何区分按下的键和我想听的键,但需要知道如何确定某个键是否刚刚被按
(使用 ubuntu 14.04.3)我需要安装 libx32gcc-4.8-dev libc6-dev-i386。当我尝试通过写来下载它时: sudo apt-get install libx32g
早上好,我正在处理 DoExpressCheckout 的支付状态响应,用于 InstantPaymentOnly Sale。 https://developer.paypal.com/docs/cl
我在 Wikipedia 之后用 Java 实现了 Held-Karp它给出了一个循环总距离的正确解决方案,但是我需要它给我路径(它不会在开始的同一个顶点结束)。如果我从循环中取出权重最大的边,我可以
我发现在任何使用按键监听器的类中实现的方法包括 keyPressed、keyReleased 和 keyDown,但是如何才能在按键保持按下状态时连续发生某些事情?意思是有没有办法实现“keyHeld
我正在尝试在 Windows 应用程序的 bridview 中突出显示所选项目。 更准确地说:
当 bundle 在 MVC4 中注册时,什么负责“拦截”对 /bundles/someBundle?v=1hDzBpmYJm4Iu-OjRN1YqS1WeNThVl0kStLJGP8WCr41 的传
我很清楚旅行商问题的 DP 解决方案;也称为 TSP 的 Held 和 Karp 算法。 我用位掩码实现了它,它是这样的: int TSP(int pos, int bitmask) { if (
我试图弄清楚是什么导致我的程序挂起,我的大部分锁不应该持有超过 200 毫秒。 (实际上要少得多!) 我想创建两个新函数(Lock() 和 Unlock()),这样 Lock 就会有一个计时器,如果
我的 LibGDX Android 游戏在加载过程中随机崩溃。我想这与 Android 由于主线程中长时间运行的任务或内存问题而杀死我的应用程序有关。 在这方面,我想了解日志中这些行的含义: 03
我正在开发一个电子邮件应用程序,并将消息类作为文件保存。不过,我对电子邮件的操作有一些疑问。 例如, 有一条消息将其类作为文件保存,但当用户想要删除它时,如果我从文件中获取消息类,并且在调用folde
当光标通过 contains(p) 方法在矩形数组列表上移动时,我需要更改光标。问题是 我的第一个使用迭代器迭代矩形的算法无法按预期工作。光标仅在将鼠标悬停在第一个矩形上时才会发生变化,在其他矩形中它
我将数据分为训练样本和测试样本 (70/30),用于基于回归预测的问题(MLP、LSTM 等)。 在代码中: history = model.fit(X_train, y_train, epochs=
我使用 Java 实现的 Held-Karp TSP algorithm解决 25 个城市的 TSP 问题的算法。该计划通过 4 个城市。 当它在 25 个城市运行时,它不会停几个小时。我使用 jVi
据我了解,boost.variant 的所有类型被解析成真正的类型(意思好像 boost variant a; a="bla-bla" 会在编译后变成 string a; a="bla-bla" )所
使用在我的交互式 session 中运行的 IIS Express 中的 System.Diagnostic.Process.Start(),我可以执行运行 的程序作为不同的用户 具有校正功能。不幸的
我正在使用动态规划修改 TSP 的 Bellman–Held–Karp 算法。在这种情况下,经典 Bellman-Held-Karp 算法的不同之处在于某些城市必须先于其他城市被访问,但我需要保留最小
MouseEvent类具有属性 altKey , ctrlKey和 shiftKey我可以用它来确定在事件发生时是否按下了修饰键(即 Alt、Ctrl 和 Shift)。 但我想确定是否空间 在 Mo
在我的 NSView 子类中,例如,当我键入 Command+J 时,我会看到按下 Command 的 flagsChanged: ,然后按下 J 的 keyDown: 。 ..然后释放命令的flag
我目前正在为 chrome 开发一个扩展程序,它根据特定网页的快捷键执行操作。现在我正在使用“命令”API 来判断何时按下快捷键(https://developer.chrome.com/extens
我是一名优秀的程序员,十分优秀!