【发布时间】: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