我目前正在研究一个问题,我想尝试找到一个执行以下操作的算法:给定方形网格图G和起始节点S和结束节点E,其中G中的E和S,找到路径P从S到E的最大值和| P | < = k。如果它更容易,可以使G成为DAG。
网格单元格为0或1。
举个例子:
S--o--o--o
| : | |
o--o..o..o
: | : |
o--o--E--o
| : | |
o--o--o--o
S := "Starting State"
E := "Ending State"
- := "Edge value is 1"
. := "Edge value is 0"
解决方案k = 5(从我看到的)
S o o o
|
o--o o o
|
o o--E o
o o o o
S和E是任意的,所以我不能假设只是向下和向右移动,但我可以将图形转换为DAG,并假设有一些损失达到最优。
边缘值是成本,G是网格图,其中每个节点都连接到其四个邻居。
首先,这个问题在文献中是否已为人所知?我没有发现任何相关信息。它是在NP中还是有人对快速算法有所了解?我问了我选择的搜索引擎,并且有人在StackOverflow上问了一些与之相关的内容,但他们的问题描述与100%不匹配,因为他们的目标是最后一行,其中我的是一个独特的节点。
答案 0 :(得分:1)
Aight,先警告:我已经想到了这一点。我似乎记得以前读过类似的东西,但我不记得在哪里,所以虽然它似乎是正确的但我不能确定它。如果我稍后发现一个漏洞,我会回来编辑这篇文章并通知你。
设 L(k,v)是从 S 到某个节点的最长 k 的路径值v ,并假设 v 具有前辈 {u1,u2,... um} 。由于 G 是DAG,因此必须是
L(k, v) = max { L(k-1, u1) + w(u1, v), L(k-1, u2) + w(u2, v), ..., L(k-1, um) + w(um, v) }
其中 w(u,v)是从 u 到 v 的边缘权重。
要使用它,我们要做的是找到长度为的最高值路径< R 到 S 的 R 半径内的每个节点。然后,这给了我们足够的信息来计算长度的最高值路径< R + 1 到 S 的半径 R + 1 内的每个节点。所以:
L
并设置L[S] = 0
。保留所有其他条目未定义。L[v]
规则应用于图表中的每个节点(忽略k
参数)
L[u]
的值,请忽略 u 计算L[v]
。 L[u]
,请保留L[v]
未定义。L[E]
有值,请将其返回。否则,从 S 到 E 的路径不会k
。这是 O(k ^ 3)时间。您可以通过仅考虑 S 的距离1内的节点和 E 的距离 k-1 来加速大型图形的加速执行步骤3,并且在第二次执行期间只有 S 的距离2内的节点和 E 的距离 k-2 ,等等,但那仍然是立方时间。