This gist 显示了寻找一些特殊路径的代码。它找到了所有合法的路径,但没有找到所有最好的路径:我想获得 [1, 2, 3, 3]
、 [2, 2, 3, 3]
和 [5, 4, 3, 3
但只返回第一个路径。
我错过了什么?
答案 0 :(得分:1)
最简单的方法是生成所有解决方案,然后对它们进行排序。并利用内置谓词,这样做,将项目生成为 Cost-Path
而不是您的表单(我认为是 [Path,Cost]
。
所以,像这样:
findall(Total-NbCols,
onepath(Grid, NbCols, Total),
AllPaths),
keysort(AllPaths, [Cost-Path|_]).
如果有多条路径具有相同的最小成本,则只给出其中的一条。如果您想要以最低成本获得全部:
solution(Paths, Cost):-
Grid = [
[1, 1, 4, 5, 2, 1, 2],
[3, 2, 3, 1, 2, 4, 0],
[3, 5, 2, 3, 6, 2, 4],
[3, 7, 1, 2, 5, 8, 5]
],
findall(Total-NbCols,
onepath(Grid, NbCols, Total),
AllPaths),
keysort(AllPaths, [Cost-_|_]),
convlist(eq_cost(Cost), AllPaths, Paths).
除了 setof/3 会为你做排序。我把它作为一个微不足道的练习(你可以做嵌套的 setof)。