线性瓶颈分配(LBAP)的代码或伪代码?

时间:2012-11-27 03:22:32

标签: variable-assignment graph-theory linear-programming

我正在建造一个机器人模拟器,我有n个机器人需要去n个不同的位置。所有机器人同时开始移动。当机器人到达指定位置时,它会停止移动。所有机器人到达其位置所需的总时间由给定机器人到达其指定位置所需的最长长度决定。我想通过巧妙地为机器人分配目的地来最小化这个最长的长度。

显然这个问题是"Linear bottleneck assignment problem"

我找不到任何代码来解决这个问题。任何人都有任何伪代码或实际代码(任何语言都很好,Ruby / Java首选)来有效地解决这个问题吗?

2 个答案:

答案 0 :(得分:2)

阈值算法是解决线性瓶颈分配问题的标准算法之一。快速搜索没有出现我可以在这里轻松复制和粘贴的伪代码,但是由Rainer Burkard,Mauro Dell'Amico和Silvano Martello在分配问题的第175页给出了伪代码。以下是relevant page的Google图书链接。几页之后,他们给出了另一种利用二元性的算法,但我对那个并不熟悉。

答案 1 :(得分:0)

LBAP(线性瓶颈分配)只是与您的案例相关的分配和路径路由问题的整个系列中的一个特定子类。

在决定实施n个机器人的 MinMax 路由算法时,您有很多选择。 这就是我要做的事情:我从 Dijkstra的最短路径算法的最简单实现开始。

wikipedia page for Dijkstra有一个很好的可视化示例,但它们的伪代码看起来比它需要的更令人生畏。它甚至链接到robot motion planning但是从您的问题看起来您正在寻找要实现的路径算法。

[根据OP的澄清重新更新。 MINMAX]

Dijkstra仍然有效,但您还需要一些额外的步骤。 这是基本策略:

For each robot r = 1 to n
   calculate the shortest time-path for r from source of r to sink of r - (suggest starting with Dijkstra's) [if you are assuming constant speeds, then distance and length become equivalent]
Next r

MinMax架构:

  1. 按时间排序所有路径(时间)并取最长路径。 (这是你的理论最小时间。) - 我们称之为t_max
  2. 其他机器人r有时间"slack" - t_max减去time_r
  3. 拿走每对机器人,看看他们的路径是否有冲突。
    • 如果没有冲突,你就完成了。
    • 如果是冲突,则必须重新路由(冲突的节点/边缘避免),但在松弛时间内。 (最简单的重新路由是等到冲突的机器人清除边缘或交叉点。)
  4. 如果您能够在slack内路由,那么您就完成了。否则,将t_max更新为最长(重新路由)的路径。
  5. 以下是您应该能够使用的Dijkstra代码的一些示例。 (网络搜索将产生更多。)

    1. http://cs.fit.edu/~ryan/java/programs/graph/Dijkstra-java.html(Java)
    2. Here's a gist in Ruby
    3. 附加说明:

      1. 您不必限制自己使用Dijkstra的方法。您可以在找到它们时换出并尝试其他路由算法。尝试一些路由算法。
      2. 请记得检查是否存在冲突。 (即两个机器人同时位于同一节点上)无冲突路由的最基本实现涉及一些优先级规则,一个机器人在节点进入之前要等到节点清空。
      3. 希望有所帮助。