【问题标题】:scheduling algorithm - only first visit paid调度算法 - 仅支付首次访问
【发布时间】:2012-01-20 20:31:24
【问题描述】:

我需要知道之前是否研究过以下问题:

让我们有一个有向无环图 G。该图是连通的,它只有一个源顶点(没有传入节点)和一个接收顶点(没有传出节点)。

每个顶点都被分配了一个非负的美元价格和一种颜色。

我们的目标是找到一条从起点到终点的路径,以使已访问边的价格总和最大化。

关键是,只有在第一次访问特定颜色的顶点时才会收到价格。例如,当我们看到价格为 1 美元的红色顶点,然后是价格为 2 美元的蓝色顶点,然后是 30 美元的红色顶点时,总价格为 3 美元。

我的特定问题的大致大小:50000 个顶点,3000 种颜色,从开始到下沉的典型步行长度大约 200 条边。

             ------>[B red $1]---                   ---->[E red $1]----
            /                    \                 /                   \
[A black $0]                      ==>[D black $0]==                     ==>[G black $0]
            \                    /                 \                   /
             ---->[C green $2]---                   ->[F green $1000]--

【问题讨论】:

  • 它看起来像是TSP problem的变体?
  • 我喜欢这个问题的一点是,在某些情况下,您很可能不希望碰到一种颜色,因为要达到这种情况,您需要在另一种颜色上取较低的值并给您净亏损。
  • @bacchus:我不这么认为:TSP 必须遍历所有顶点。我必须选择其中的几个。

标签: algorithm optimization scheduling graph-theory


【解决方案1】:

这是考虑动态图的最短路径问题的一个很好的变体,即随时间变化的图(随着您离源越来越远,边权重会发生变化)。 Dijkstra's algorithm 将解决它,因为边的权重是随你去计算的,所以边权重根据你去过的地方而不同的事实并不重要。这是 wikipedia 的描述,其中 以粗体显示颜色变化问题的考虑

让我们开始的节点称为初始节点。让 节点Y的距离是从初始节点到Y的距离。 Dijkstra 算法将分配一些初始距离值,并将 尝试逐步改进它们。

  1. 为每个节点分配一个暂定距离值:对于我们的初始节点将其设置为零,对于所有其他节点将其设置为无穷大。

  2. 标记所有未访问的节点。将初始节点设置为当前节点。创建一组未访问节点,称为未访问集 由除初始节点外的所有节点组成。

  3. 对于当前节点,考虑其所有未访问的邻居并计算它们的暂定距离。 现在这取决于到目前为止所选择的路径。例如,如果当前 节点 A 用距离 6 标记,连接它的边 一个邻居 B 的长度为 2 基于颜色权重,那么到 B 通过到目前为止的路径的距离将是 6+2=8。如果这个距离小于之前记录的距离, 然后覆盖那个距离。虽然邻居已经 已检查,此时未将其标记为已访问,并且仍保留在 未访问的集合。

  4. 当我们考虑完当前节点的所有邻居后,将当前节点标记为已访问并将其从 未访问集。被访问的节点将永远不会被再次检查;它的 现在记录的距离是最终的和最小的。

  5. 如果目标节点已被标记为已访问,则停止。算法完成。

  6. 将标记为最小暂定距离的未访问节点设置为下一个“当前节点”并返回步骤3。

Nannicini 和 Liberti 在Shortest paths on dynamic graphs 上进行了一次不错的调查。

【讨论】:

  • 可能我没明白你的意思,但我认为这行不通。想象在遍历开始时有两次交替行走——第一次在绿色 $1 顶点上,第二次在红色 $2 顶点上。然后,接近尾声时,又有绿色 1000 美元和红色 1 美元两种选择。如果您首先选择红色的($2 > $1),您将无法再使用有价值的绿色。
  • @danatel 您希望将权重视为动态的点,这意味着权重取决于到达该点的路径。这个想法与 Dijkstra 算法的工作方式兼容,因为您一次迈出一步。
  • 请告诉我您的算法如何找到我添加到问题中的示例的最佳遍历。从 A 走到 G。我认为正确的解决方案是 A-B-D-F-G,价格为 1001 美元,但 Dijkstra 算法访问 A (0)、B(1)、C(2)、D(2)。现在,F 失去了它的价值,所以 F(2)、E(3) 和 G(3)。我做错了什么?
【解决方案2】:

如果我正确理解了这个问题,它可以在 O(E) 时间内解决,如下所示。 让我们从正式定义它的解决方案开始。

给定一个 DAG G = (V, E),让 FS(i) 成为 前向星 一个顶点i

FS(i) = {(x, y) in E: x = }

C为到目前为止访问过的顶点的颜色集合,令p[i]和c[i]分别为顶点的价格和颜色i;现在定义 reward r 用于从顶点 i 到顶点 j 属于 FS(i) 为

r[i, j] = p[j] 如果 c[j] 不属于到 C

否则r[i, j] = 0(如果c[j]属于C

我们现在准备如下定义我们的子问题:

D(i, j, C) = max on k属于 FS(i) { r[i, k] + D(k, j , C 联合 {c[k]}) }

以 D(i, i, C) = 0 作为终止条件(到达汇节点时需要)

因此要解决的初始问题是 D(s, t, {c[s]}) 其中s t 分别是源和汇顶点:

D(s, t, {c[s]}) = max on k 属于 FS(s) { r[s, k] + D(k , t, {c[s]} 联合 {c[k]}) }

为了解决这个问题,您使用与顶点的前向星对应的邻接列表来存储 DAG。然后从源顶点开始,在考虑颜色约束的情况下确定与所有路径相关的成本。由于您基本上是在探索顶点的前向星并且永远不会返回,因此使用哈希表表示集合的整体复杂度为 O(E),因此插入颜色和成员资格测试需要 O (1) 平均时间。我所说的 union 实际上是一个 insert 操作(结果都是一样的,因为每次你做一个单例集的并集)。

【讨论】:

  • 这是我尝试过的方法之一。我认为问题在于颜色约束不是由所有颜色的集合定义的,而是由它们所有可能组合的幂集(在我的例子中为 2^3000)定义的。例如,在使用红色、使用绿色、同时使用红色和绿色等条件下,我们必须记住成本。每个成本都不一样。这一系列成本需要在每个步骤中更新。成本数组的大小随着 i!当我们走 DAG 时。我将它与修剪一起使用,它适用于某些情况。
  • @danatel:您可能需要编辑/更新您的问题以反映与颜色相关的信息。此外,我仍然需要其他信息才能完全理解您的问题。在您的示例中,如果您发现一个红色顶点,因为 a)您已经访问了一个红色顶点或 b)您已经访问了两个红色和绿色顶点,有什么区别?我认为在这两种情况下,与新发现的红色顶点相关的奖励都是零。
  • 那么,请清楚地解释一下您所说的在使用红色等条件下的成本是什么意思。这个成本与与新发现的顶点相关联的奖励之间有什么关系?
  • 所以,我“使用”了成本而不是“奖励”。您的示例存在差异(R 或 2R+G 访问 R)。但是你事先并不知道你会在接近尾声时发现什么。所以你必须记住 R、G 和 RG 的奖励,因为附近可能有 4 种步行之间的选择:便宜的黑色、更有价值的绿色、类似的红色和非常好的走过 R 和 G 展位。所以你可以只走一次 DAG,但是您必须将到目前为止获得的奖励存储在由 3000 位位图索引的哈希表中(我称之为数组)。在每个访问的节点之后,您更新 .当您访问 R
  • 在每个访问过的节点更新哈希表后,R+G 之后的 R 和 R+R+R+G 之后的 R 共享哈希表中的同一个单元格 - 存储最大奖励。
【解决方案3】:

有趣的问题。它是 NP 难的,但与任何经典的逼近算法文献都没有相似之处。

从集合覆盖实例 {{1, 2, 3}, {2, 4}, {3, 4}, {4, 5}} 的减少示例证明。所有边都朝下。

 s:$0
 | \
 |   \
 |     \
 |     1:$100
 |      |
!A:$1  2:$100
 |      |
 |     3:$100
 |     /
 |   /
 | /
 *:$0
 | \
 |   \
 |     \
 |     2:$100
!B:$1   |
 |     4:$100
 |     /
 |   /
 | /
 *:$0
 | \
 |   \
 |     \
 |     3:$100
!C:$1   |
 |     4:$100
 |     /
 |   /
 | /
 *:$0
 | \
 |   \
 |     \
 |     4:$100
!D:$1   |
 |     5:$100
 |     /
 |   /
 | /
 t:$0

我不知道是否有一个好的近似算法(这种减少并不排除它)。使用单位流而不是路径的 LP 松弛可能足以让分支和绑定工作。

【讨论】:

  • @Per:谢谢。我同意。我想知道,如果这个问题有名字,之前已经研究过,是否有人发明了近似或启发式算法。
  • @DonAndre 不,不是,但我会想象(a)会欣赏正式证明(b)的人无法从示例中弄清楚它会如何发展空。
  • @dantel使用的 LP 将非常非常难以在您感兴趣的规模上足够有效地解决。其他人将不得不与 AI 文献交谈。
  • 啊,臭名昭著的恐吓证明:显然,这必须让所有人都清楚!你已经证明,当你把一个集合覆盖问题变成一个尴尬的集合覆盖问题时,它仍然是一个集合覆盖问题。您需要将原始问题简化为集合覆盖问题,以显示它具有相同的属性,而不是相反。这只是意味着原始问题的某些实例可能会被设置覆盖问题。
猜你喜欢
  • 2019-04-26
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 2011-10-02
  • 1970-01-01
  • 2017-01-04
相关资源
最近更新 更多