未能获得所有解决方案 [findall + 最小解决方案]
Failling to obtain all the solutions [findall + minimal solutions]
This gist 显示寻找一些特殊路径的代码。它找到了所有合法路径,但未能找到所有最佳路径:我想获得 [1, 2, 3, 3]
、 [2, 2, 3, 3]
和 [5, 4, 3, 3
但只返回第一条路径。
我错过了什么?
最简单的方法是生成所有解决方案,然后对它们进行排序。要利用内置谓词,请这样做,将项目生成为 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).
Except setof/3 将为您进行排序。我把它作为一个微不足道的练习(你可以做嵌套的 setof)。
This gist 显示寻找一些特殊路径的代码。它找到了所有合法路径,但未能找到所有最佳路径:我想获得 [1, 2, 3, 3]
、 [2, 2, 3, 3]
和 [5, 4, 3, 3
但只返回第一条路径。
我错过了什么?
最简单的方法是生成所有解决方案,然后对它们进行排序。要利用内置谓词,请这样做,将项目生成为 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).
Except setof/3 将为您进行排序。我把它作为一个微不足道的练习(你可以做嵌套的 setof)。