数独求解器性能问题

Sudoku solver performance problems

我的数独序言求解器有问题。它正在工作,但性能非常糟糕。对于小的,它工作得很好,但是更大的像 9x9 或更大的需要 10 分钟或更长时间。我想像现在一样将其保留为不确定的大小。有人可以帮忙吗?

solve_sudoku(Rows,Sol):-
    length(Rows,Max),
    maplist(same_length(Rows),Rows),
    append(Rows, List), List ins 1..Max,
    maplist(all_distinct, Rows),
    transpose(Rows, Columns),
    maplist(all_distinct,Columns),
    maplist(label,Rows),
    boxes(Boxes,Rows),
    maplist(all_distinct,Boxes),
    boxes_distinct(Boxes),
    Sol = Rows.

boxes(Bs,M) :-
    length(M,Len),
    Sq is round(sqrt(Len)),
    findall(B, (between(1, Sq, R),
            between(1, Sq, C),
            block(M, Sq, R, C, B)), Bs).

cell(M, R,C, V) :-
    nth1(R,M,Row), nth1(C,Row,V).

block(M, Sq, R,C, B) :-
    findall(V, (between(1, Sq, X),
            between(1, Sq, Y),
            I is (R-1) * Sq + X,
            J is (C-1) * Sq + Y,
            cell(M, I, J, V)), B).

boxes_distinct([]).
boxes_distinct([BH|BT]):-
    all_distinct(BH),
    boxes_distinct(BT).

输入是要解决的数独列表的列表,输出是已解决的数独列表。

我觉得你应该打电话给

maplist(label,Rows)

之后

boxes_distinct(Boxes)

通常你应该在声明所有约束后调用 label 或 labeling。

并使用 "labeling predicate with ff or ffc option" 而不是 "label" 可能会提高效率。

boxes_distinct(Boxes) 似乎没用,已经被 maplist(all_distinct,Boxes) 覆盖,在子句末尾使用 label(List)(而不是 maplist(label,Rows))。无论如何,@gabrielte (+1)

指出了主要问题