找到所有解决方案后,如何评分解决方案并选择一个解决方案



这是问题,setof返回一组解决方案

solve([A1, A2, A3, B1, B3, C1, C2, C3, T]):-
    permutation([1,2,3,4,5,6,7,8], [A1, A2, A3, B1, B3, C1, C2, C3]),
    T is A1 + A2 + A3,
    A1 + A2 + A3 =:= A1 + B1 + C1,
    A1 + A2 + A3 =:= A3 + B3 + C3,
    A1 + A2 + A3 =:= C1 + C2 + C3.

然后我找到所有解决方案

?- setof(Z,solve([A1,A2,A3,B1,B3,C1,C2,C3,T]),Set).
A1 = 1,
A2 = 4,
A3 = 8,
B1 = 7,
B3 = 3,
C1 = 5,
C2 = 6,
C3 = 2,
T = 13,
Set = [_G5594] ;
A1 = 1,
A2 = 5,
A3 = 6,
B1 = 8,
B3 = 4,
C1 = 3,
C2 = 7,
C3 = 2,
T = 12,
Set = [_G5578]
...

如何过滤和得分结果找到解决方案的最大t值(15)?

我建议使用 clp(fd)约束进行此类组合任务。

例如:

: -  use_module(库(clpfd))。解决方案([A1,A2,A3,B1,B3,C1,C2,C3],T): -         [A1,A2,A3,B1,B3,C1,C2,C3] Ins 1..8,        t#= a1   a2   a3,        A1   A2   A3#= A1   B1   C1,        A1   A2   A3#= A3   B3   C3,        A1   A2   A3#= C1   C2   C3。

确切的细节在Prolog Systems之间有所不同,因此请查看您的系统手册以获取更多信息。可以通过标签选项获得最大值,例如:

? - 解决方案(vs,t),标记([max(t)],vs)。vs = [8、8、8、8、8、8、8、8], t = 24; vs = [7、8、8、8、7、8、7、8],t = 23;vs = [7、8、8、8、8、8、8、7],t = 23;ETC。

有关更多信息,请参见CLPFD。

您可以 commit 使用once/1的第一个解决方案。

最新更新