当在Prolog中应用某些条件时,如何计算多个点之间的最短路径?

时间:2011-10-20 21:19:06

标签: prolog

我在Prolog很新,我不知道如何真正开始这项练习。 提示和示例将非常感激。

我们有一个带庭院的花园。在花园里种植了随机数量的树木,每棵树和庭院之间只有一条路。另外,一些树通过恰好一条路径相互连接。我们知道每条路径的长度。

这样一个花园的例子由以下事实给出:

patio_to_tree(t1,4).
patio_to_tree(t2,4).
patio_to_tree(t3,1).
patio_to_tree(t4,6).
patio_to_tree(t5,12).

tree_to_tree(t1,t2,4).
tree_to_tree(t2,t3,7).
tree_to_tree(t2,t4,2).

分配是编写一个谓词walk / 2,它计算花园周围最短路径的列表P,这样你只需使用一次路径并访问每棵树。步行总是在露台上开始和结束。

上述花园的例子:

walk(P,L).
P = [t, b1, b2, b4, t, b3, t, b5, t].
L = 42.

谓词只需要处理两个变量,例如,它不需要能够计算给定长度L的路径。

我在Prolog中的经验仅限于简单的列表和算术示例,所以我不知道从哪里开始。我认为findall / 3对于获取花园中所有树木的列表可能是有用的,因为可能有任何数量。我可能必须以递归方式查看该列表以获取有关树的其他信息,但我的基本情况应该是什么?最简单的步行是当花园没有树木时,那就是P = [t], L = 0。那是一个合适的基础案例吗?

我假设满足要求的最短路径只是访问未连接到另一棵树并返回庭院的每棵树,然后按顺序访问连接到另一棵树的每棵树。我是否需要一个累加器来保存到目前为止访问的路径总长度的值,还是有更简单的方法来获得它?

我注意到这与一个名为旅行商问题的问题非常类似,除了有一个中心点要返回,但我不确定我是否应该以类似的方式解决这个问题。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这个 是经典的旅行商问题(TSP),通常有回到起始位置的约束。

您对findall的直觉是正确的。获取树列表,将其命名为L。然后使用permutation(内置于SWI-Prolog)和setof获取L的所有排列并检查它们的总路径长度,即包括开始和返回的路径长度。庭院。

这种生成和测试方法很昂贵,但比A* algorithm for the TSP或分支绑定方法更容易编程。