我想知道这个问题是否有更优雅的解决方案。蛮力方法(深度优先搜索)计算量太大。
您将获得与路径互连的节点网络。每条路径沿路径有一个距离和零个或多个元素,每五分钟只能收集一次。收集这些元素会增加你的分数。
目标是计划接下来五分钟的路径遍历,记住在过去五分钟内已经遍历的路径,以便最大化分数增加。
蛮力算法是尝试从当前位置开始的每条可能路线,避开我们已经到过的地方,在我们行驶了最大规划距离或时间时停下来,并保持收集的虚拟累积奖励。然后,我们所要做的就是选择得分最高的路线。
不幸的是,图表中的节点和路径数量足够高,即使只计算五分钟的旅行需要太多计算。
是否有一种已知算法比蛮力方法更有效地解决了这个问题?即使它只找到近似解,也不是最优解。
修改
谢谢@SaiBot,这是我的最终解决方案,万一有人发现自己也会问同样的问题:
我为从节点A到节点B的每条路径分配了一个唯一的ID。从B到A的路径有自己的ID。在DFS搜索功能之外但是可以访问它,我保留了一个由ID键入的哈希值,该值包括在采用此路径之前行进的距离以及到目前为止收到的奖励的大小。为了最大限度地减少额外工作,我确保在每个节点上,传出路径的排序时间最短,最长。然后,当要求DFS算法评估它之前评估过的路径时,它首先检查的是缓存结果。如果缓存的结果到达:
( reward <= previous_reward && distance >= previous_distance )
|| reward / distance <= previous_score
然后有理由认为再次递归此路径没有任何好处,因此它会立即返回0分,以立即取消其考虑。否则,它会在缓存中记录新的传入奖励,距离和分数,并正常进行。
另外,我做了另外一件事。我推断我想要在路径上有一定的新颖性,这意味着我并不希望它找到一条获得最大回报的小路径,我希望它能够探索地图。所以我向传出节点添加了一个过滤器,说如果在过去的X分钟内访问过该节点,请将其从考虑中删除。这有一个副作用,允许算法将自己路由到一个角落,所以我添加了一个后备,如果没有可用的选项,它将按上次访问的排序路径,最早的,然后尝试订购。
结果很不错,但我会做更多的实验,看看能不能取得更好的效果。
答案 0 :(得分:1)
您的问题与多标准网络中的帕累托最优路径计算密切相关,例如,如this paper中所述。
如果你只有一个与每条边相关的标准(如距离),那么Dijkstra可以让你快速找到所有可能的路径(优化距离)。这是可能的,因为如果到达该节点的另一条路径距离较远,您可以“丢弃”到达节点的路径。
如果您有两个或更多与每条边相关的标准(例如,距离和奖励),则会出现问题。现在,如果两条路径(从您的起始节点开始)导致同一节点并且path_1的距离小于path_2,但path_2的奖励高于path_1,则您也不能丢弃。但是,如果路径的两个条件都比另一个路径更差,则可以丢弃它。
the above paper中描述了一种完成搜索的可能算法。
修改强>
我上面的回答不会考虑路线中重新出现的元素。如果要包含此内容,则必须知道在路径规划期间元素何时何地重新出现。然而,这将使事情变得更加复杂,因为你可以通过“等待”重新生成元素来获得更高的回报。