数独求解器性能问题
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)
指出了主要问题
我的数独序言求解器有问题。它正在工作,但性能非常糟糕。对于小的,它工作得很好,但是更大的像 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)