【问题标题】:Reasonably efficient algorithm for reward driven graph traversal奖励驱动图遍历的合理高效算法
【发布时间】:2018-06-17 13:18:15
【问题描述】:

我想知道这个问题是否有更优雅的解决方案。蛮力方法(深度优先搜索)计算量太大。

给你一个由路径互连的节点网络。每条路径都有一个距离和沿路径的零个或多个元素,这些元素只能每五分钟收集一次。收集这些元素会增加你的分数。

目标是规划接下来五分钟的路径遍历,牢记最近五分钟已经遍历的路径,从而最大限度地提高分数。

蛮力算法是从当前位置尝试每条可能的路线,避开我们已经去过的地方,在我们达到最大计划距离或时间时停下来,并保持收集到的奖励的虚拟统计。那么我们要做的就是选择得分最高的路线。

不幸的是,图中的节点和路径的数量足够多,以至于即使只计划五分钟的行程也需要太多的计算。

有没有比蛮力法更有效地解决这个问题的已知算法?即使它只找到一个近似解,而不是最优解。

编辑

谢谢@SaiBot,这是我的最终解决方案,以防有人发现自己问同样的问题:

我为从节点 A 到节点 B 的每条路径分配了一个唯一 ID。从 B 到 A 的路径有自己的 ID。在 DFS 搜索功能之外但可以访问它,我保留了一个由 ID 键入的哈希,该值包括在走这条路之前经过的距离,以及到目前为止收到的奖励的大小。为了尽量减少额外的工作,我确保在每个节点上,传出路径从最短到最长排序。然后,当要求 DFS 算法评估它之前评估过的路径时,它首先检查的是缓存的结果。如果缓存结果到达:

( reward <= previous_reward && distance >= previous_distance )
|| reward / distance <= previous_score

然后推理再次递归这条路径没有任何好处,所以它立即返回0分,立即取消考虑。否则,它将新传入的奖励、距离和分数记录在缓存中,并正常进行。

此外,我还做了一件事。我的理由是我希望路径中有一定的新颖性,这意味着我不希望它仅仅找到一条获得最大奖励的微小路径,我希望它探索地图。所以我给传出节点添加了一个过滤器,说如果该节点在过去 X 分钟内被访问过,则将其从考虑中删除。这具有允许算法将自身路由到角落的副作用,所以我添加了一个后备,如果没有可用的选项,它会按上次访问的,最旧的在先对传出路径进行排序,然后尝试命令。

结果很不错,但我会做更多的实验,看看是否能得到更好的结果。

【问题讨论】:

  • 边上的元素数量是遵循某种已知的随机分布,还是元素在 5 分钟后“重生”到始终相同的数量?
  • 当你收集它们时,它们就消失了。五分钟后,他们回来了。总是在同一个地方。

标签: algorithm machine-learning graph-traversal


【解决方案1】:

您的问题与多准则网络中的帕累托最优路径计算密切相关,例如,如this paper 中所述。

如果您只有一个标准(如距离)与每条边相关联,那么Dijkstra 可让您快速找到所有可能的路径(优化距离)。这是可能的,因为如果到达该节点的另一条路径已经具有更短的距离,您可以“丢弃”到达该节点的路径。

当您有两个或多个与每条边相关的标准(例如距离和奖励)时,就会出现问题。现在,如果两条路径(从您的起始节点开始)通向同一个节点,并且 path_1 的距离小于 path_2,但 path_2 的奖励高于 path_1,您也不能丢弃。但是,如果一条路径的两个标准都比另一条路径差,您可以丢弃它。

the above paper 中描述了一种可能的算法来进行完整搜索。

编辑

我上面的回答不会考虑在路线中重新出现的元素。如果要包括此内容,则必须知道元素在路线规划过程中何时何地重新出现。然而,这会使事情变得更加复杂,因为您可以通过“等待”元素重生来获得更高的奖励。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多