【发布时间】:2016-09-15 06:20:14
【问题描述】:
我正在尝试使用 DLV 在图中以最小距离查找所有路径。假设我有以下图表:
我期待获得谓词(我希望我不要跳过任何):
- 路径(a, b, 1), 路径(a, d, 1), 路径(a, e, 1), 路径(a, c, 2)
- 路径(b, a, 1), 路径(b, c, 1), 路径(d, d, 2), 路径(b, e, 2)
- 路径(c, b, 1), 路径(c, e, 1), 路径(c, a, 2), 路径(c, d, 3)
- 路径(d, a, 1), 路径(d, b, 2), 路径(d, e, 2), 路径(d, c, 3)
- 路径(e, a, 1), 路径(e, c, 1), 路径(e, d, 2), 路径(e, b, 2)
我假设您可以向左或向右移动拱门。所以,我尝试了以下方法:
path(X, Y, 1) :- arc(X, Y).
path(Y, X, 1) :- arc(X, Y).
path(X, Z, L) :- path(X, Y, M), path(Y, Z, N),
X!=Z,
L = M + N,
not path(X, Z, V), V < L, #int(V)
第三条规则的想法是添加 2 条现有路径,如果它们不返回 (X!=Z) 并且还没有一条路径连接相同边缘的更短距离(不是 path(X, Z, V),V
当我运行此代码时(使用标志 -N=5 设置 #maxint=5),我得到不应该存在的路径,例如 path(d,a,5)。我不知道问题出在#int(V) 还是其他问题上,但我不希望这些路径出现,因为我已经有了路径(d,a,1)。可能是因为#int(V) 但我不知道如何正确地做到这一点。
谁能帮我解决这个问题?提前致谢。
【问题讨论】:
-
我刚刚解决了使用 path 谓词中的列表查找路径的问题,但我仍然想知道为什么我在这里发布的解决方案不起作用跨度>
-
我还设法根据@CapelliC 的输入提出了一个解决方案。如果有人感兴趣,我将发布带有和不带有列表的解决方案
标签: path shortest-path declarative datalog answer-set-programming