【问题标题】:Given a node network, how to find the highest scoring loop with finite number of moves?给定一个节点网络,如何找到具有有限移动次数的最高得分循环?
【发布时间】:2013-04-12 20:39:31
【问题描述】:

对于我的一个项目,我正在尝试创建一个求解器,给定一组具有加权路径的随机加权节点,它将找到具有有限移动次数的最高得分路径。我创建了一个视觉对象来帮助描述问题。

为了完整起见,此示例显示了所有连接边。边上的数字是遍历成本,节点内的数字是分数。一个节点只在遍历到它的时候才算,不能从它自己遍历到它自己。

从图片中的描述可以看出,有一个开始/结束节点,其中包含随机放置的节点,每个节点都有一个任意分数。每个节点都连接到所有其他节点,每个连接都有一个从剩余移动单元总数中减去的任意权重。为简单起见,您可以假设连接的权重是距离的函数。节点可以多次移动,并且再次应用它们的分数。目标是找到在给定移动限制下得分最高的循环路径。

求解器永远不会处理超过 30 个节点,通常处理 10-15 个节点。我仍然需要尝试让它尽可能快。

除了纯粹的蛮力方法之外,还有什么算法或方法可以帮助我解决这个问题?

【问题讨论】:

  • 似乎类似于 DP 加权背包类型问题。谷歌搜索动态编程并检查this out
  • "节点可以多次到达" 他们得分不止一次吗?
  • @DavidEisenstat 是的。这是隐含的,因为所有节点都连接到所有其他节点;如果不获得分数,则移动到节点是没有意义的,因为节点不是导航限制。更新的问题。
  • 如果我们采取一些步骤,那么剩余步骤的评分不取决于确切的历史记录是否正确?如果是这样,就有一个多项式时间动态程序。如果没有其他人,我会在一段时间内发布详细信息。
  • @DavidEisenstat 如果我理解正确,不,它没有。唯一的限制是您从起始节点开始,在起始节点结束,并且不超过移动/步数限制。当您移动到一个节点时,您必须从该节点移动到另一个节点,即您当前的位置很重要。不管怎样,我很想看看你有什么。

标签: algorithm nodes


【解决方案1】:

这是一个 O(m n^2) 时间的算法,其中 m 是移动次数,n 是节点数。

对于 {0, 1, ..., m} 中的每个时间 t 和每个节点 v,计算从 start 节点开始到 v 结束的 t-step walk 的最大分数,如下所示。如果 t = 0,则只有 walk,即在起始节点处不做任何事情,因此如果 v 是起始节点,则 (0, v) 的最大值为 0,否则为 -infinity(即不可能)。

对于 t > 0,我们使用 t - 1 的条目来计算 t 的条目。为了计算 (t, v) 条目,我们将 v 的分数加上 (t - 1, w) 条目的所有节点 w 的最大值之差减去从 w 到 v 的转移惩罚。换句话说,一个到 v 的最优 t 步步行包括从某个节点 w 到 v 的一步,然后是 (t - 1) 步步行到 w,并且这个 (t - 1) 步步行必须是最优的,因为历史不会影响未来评分。

最后,我们查看 (m, start node) 条目。要恢复实际的行走,需要向后工作并反复确定哪个 w 是最好的节点。

【讨论】:

  • 老实说,我不明白你是从哪里来的;你可能误解了这个问题。我真的不知道你所说的“历史无关紧要”是什么意思。必须遍历节点,这意味着您从一个节点移动到下一个节点。这样做意味着您每次移动都会改变所有节点的行程时间,因为您的位置正在发生变化,并且每个节点都有自己独特的连接集,与其他节点的连接权重与前一个节点不同。
  • @Slight 我的意思是正确的历史并不重要;只有你现在在哪里才重要。
  • 好吧,无论哪种方式,您的答案似乎都没有包含解决方案,而是更多的想法,即使如此,它似乎也很模糊。您意识到每个节点转换的成本都是可变的,整个“向后工作”部分听起来像是解决方案应该采用的。如果您在这里真的有解决方案,如果您愿意详细说明,我绝对想听听。
猜你喜欢
  • 2021-07-01
  • 1970-01-01
  • 2013-08-27
  • 2023-03-16
  • 1970-01-01
  • 2023-02-17
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
相关资源
最近更新 更多