未能获得所有解决方案 [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)。