未能获得所有解决方案 [findall + 最小解决方案]

时间:2021-06-21 19:59:20

标签: prolog

This gist 显示了寻找一些特殊路径的代码。它找到了所有合法的路径,但没有找到所有最好的路径:我想获得 [1, 2, 3, 3][2, 2, 3, 3][5, 4, 3, 3 但只返回第一个路径。

我错过了什么?

1 个答案:

答案 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)。