图搜索 - 找到最有效的路线

时间:2016-04-05 22:47:49

标签: python graph-theory networkx

我正在处理图搜索问题,可以将其提炼到以下更简单的示例:

根据以下回复更新以澄清

复活节兔子在森林里跳来跳去收集鸡蛋。他知道每个灌木都会有多少鸡蛋,但是每个灌木都有一个独特的蛋。从任何一个灌木丛中收集复活节兔子需要30分钟。复活节兔子每周5天搜索鸡蛋,每天最多8小时。他通常在他的洞穴中开始和结束,但周二他计划在他的朋友Peter Rabbit的洞穴结束他的一天。 Bunny夫人在特定的日子/时间给了他一些特定灌木的清单 - 这些是必须被击中的中间停留,但不列出所有停靠点(可能每天1-2次)。 帮助复活节兔子设计一条路线,在一周结束时为他提供最多的鸡蛋。

给定参数:无向图(g),节点之间的距离是旅行时间,每天8小时,5个工作日,(节点,时间,日)元组列表(r) ,(startNode,endNode,day)元组列表

问题:设计一条路线,该路线可以在5天内最大化收集的价值,而不会超过指定日期的分配时间。

约束:按规定的时间/天访问r中的每个节点。对于s中的每一天,在相应的节点上开始和结束,其集合值为0.节点每周不能访问多次。

接近:由于在每个站点的时间和旅行时间(大日那天可能是10-12)不会有很多站点,我的第一个想法是粗暴强制所有在正确点开始/停止的路由,并运行5次,删除所有访问过的节点。从那里,分别计算每个允许路线的收集值。但是,这并不能说明我的最好的事情。在第一天的路线可能会破坏在第5天最好的路线,在当天需要停止。

为了解决这个问题,我考虑通过连接所有日子并从t = 0(周开始)到t = 40(周末)开始进行一次长搜索,每天的开始/结束点为中间站。这对于暴力来说太长了。

我在如何解决问题方面苦苦挣扎 - 它不是TSP问题 - 我只会访问所有节点的一小部分(可能是200个中的50个)。它也不是一个dijkstra的路径问题,最短的路径通常是无处可去。我需要在规定的时间内最大化总收集值,从而产生所需的中间停留。任何关于如何进行的想法将不胜感激!现在我已经在python中使用networkx接近了这个。

编辑以下回复 为了回应您的编辑 - 我正在寻找解决问题的方法 - 我可以稍后找出代码,我倾向于A *而不是MDFS,因为我不需要找到一条路径(相对较快),我需要找到最佳路径的近似值。我正在努力创建一个启发式来捕捉时间限制(保持下一站所需的时间)以及最大蛋。我真的不想要最短路径,我想要最长的"最多鸡蛋的路径。在评估下一步该去哪里时,我可以很容易地做鸡蛋/分钟并以最佳速度移动到丛林,但我需要弄清楚如何鼓励它慢慢向目标移动。总会有一个解决方案 - 我可以跳到第一个灌木丛,整天坐在那里然后去解决方案(那里的位置/时间总是可以解决)

1 个答案:

答案 0 :(得分:1)

提出问题的方式并不充分。确实是一个图形搜索问题,最大化一个数字的总和(受其他约束),它可能可以通过强力解决,因为最终被遍历的节点数量不一定会攀升到数百个(对于一趟)。

每条路径可能只有几个节点,因为每个站点有30分钟的约束。一天8小时,灌木丛之间的距离可以忽略不计,最多可达16个停靠点。由于边缘成本不可忽略,这意味着每次行程应该<&lt; <16停止。

我们所追求的是5天收获的最大总和(最多5个数字)。每天收获的是收集的鸡蛋的总和超过成功的&#34;路径。 成功的路径被定义为满足所有约束的路径:

  • 路径在同一节点上开始和结束。因此,周二除外。星期二的收获是一条道路。
  • 给定日期的周期包含Mrs Bunny指定的节点 那天的清单。
  • 行程时间总和不到8小时,包括30分钟的收获时间。

因此,您可以使用修改的深度优先搜索(DFS)算法。 DFS本身可以为网络生成详尽的路径列表。但是,由于这些限制,这个DFS不必遍历所有这些。

除了到目前为止访问过的节点,这个DFS还会跟踪旅行时间&#34;和#34;鸡蛋&#34;收集到目前为止,每个&#34;跳&#34;它检查是否满足所有约束。如果不是,那么它会回溯或放弃遍历的路径。这种回溯动作&#34;自我限制&#34;枚举的路径。

如果推理到目前为止与问题(?)一致,这就是为什么它似乎没有充分意义。如果我们要重复M次的每周收获过程以确定最佳访问日常策略,那么我们将留下确定足够大的M来覆盖大多数路径的问题。相反,我们可以运行一次DFS并确定最大收获的路径ONCE,这将导致4 * CycleDailyHarvest + TuePathHarvest的简单解决方案。另一个选择是放宽8小时的限制,并说Bunny先生每天可以收获8小时,而不是8小时。

换句话说,如果所有参数都是静态的,则没有理由多次运行此过程。例如,如果每个灌木丛都要给予最多k个鸡蛋&#34;根据具体分布情况,我们可能会发现平均每日/每周访问策略,收益率最高。 (或者我对问题的看法到目前为止是错误的,在这种情况下,请澄清)。

星期二的任务更容易,就好像在寻找源和目标之间的路径,其时间总和约为8小时,收集的鸡蛋总和最多为#34;这是为什么问题没有充分理解的另一个迹象。如果一切都是静态的(图形结构,蛋/灌木,每日收获间隔)那么只有一条这样的路径,不需要检查替代品。

希望这有帮助。

编辑(问题更新后): 更新并没有彻底改变先前响应的核心,即#34;使用修改后的DFS(用于详尽列举所有路径/周期的潜力)并将约束编码为指标的条件(旅行时间,鸡蛋)收获的)每一跳更新&#34;。它只修改约束的表示方式。最重要的改变是每周一次访问每个丛林&#34;。这意味着DFS(被访问节点集)的内存不会在循环结束或一天结束时重置,而是在一周结束时重置。或者换句话说,DFS现在可以从预先填充的visited集开始。这很重要,因为它会减少&#34;可行的数量。路径长度更多。事实上,根据图形和蛋/灌木的结构,问题甚至可能最终无法解决(即零路径/周期满足条件)。

<强> EDIT2: 有一些&#34;问题&#34;我希望在这里列出我认为是你的观点尚未看到的有效点,而不是以争论的方式列出的那种方法:

  • &#34;我不需要找到一条路径(相对较快),我需要找到最佳路径的近似值。&#34;和#34;我想要&#34;最长的&#34;最多鸡蛋的路径。&#34;有些矛盾的陈述,但平均而言,它们只指向一条道路。我说这是因为它表明问题太难或不完全理解(?)

  • 启发式只会有助于创建景观。我们仍然需要遍历景观(例如最陡的下降/上升)并且将有大量的振荡机会,因为算法可能被困在两个&#34;太低&#34;,#34;太高&# 34;替代或发现局部极小/最大值没有明显的移出方式。

  • A * s的主要目标仍然是返回一条路径,必须修改它才能找到替代方案。

  • 在图表上操作时,不可能鼓励&#34;遍历特定目标,因为&#34;遍历代理&#34;不知道目标在哪里以及如何在线性权重组合的意义上达到目标(例如&#34;如果你走得太远,降低一些Xp将迫使代理开始向左转回头来自它的地方&#34;。当Bunny先生在他的洞穴里时,他有所有的K替代品,在第一个可能的选择之后他有K-M1(M1

  • MDFS将帮助跟踪根据图表指定的选项允许创建这些总和的不同方式。 (毕竟,这是一个图搜索问题)。

尽管如此,这里可以采用替代的,次优的(在计算复杂性方面)解决方案。显而易见(但虚拟的)是建立两个强制自我控制的竞争过程。一个是试图让Bunny先生离开他的洞穴,一个人试图让Bunny先生回到他的洞穴。这两个过程都基于上述MDFS,并且正在跟踪MOVEAWAY + GOBACK的成本,它们产生的路径是节点的并集。它可能看起来有点像A *但是这个在每次遍历时都会重置。它的运作方式如下:

  • AWAY STEP:

    • 从Bunny先生的洞穴向外开始MDFS并跟踪距离/蛋的总和,移动到最低成本/最高回报目标节点。
  • GO BACK STEP:

    • 现在,预先填充GO BACK MDFS的visited套,然后尝试通过一条路线回家。跟踪成本/奖励。
  • 一旦你再次回到家,你就有了一个可能的收集路径。当生成的路径在时间规范内时,重复上述步骤。

这将产生一个路径调色板,您可以在一周内(4次重复+ TuesdayPath)混合和匹配最低成本/最高奖励选项。

它不是最佳的,因为你可能会得到重复的路径(一次旅行的AWAY是另一次旅行的后退),并且因为这会迅速消除被访问的节点,它可能仍然会快速耗尽解决方案。