私はNxNのsudokuソルバーをプロローグで書いています。以下のコードは、4 * 4解決のためにうまく機能します。 (私はいくつかのドメイン情報を持っています)しかし、それは9x9のために遅いです。私は行の作成機能を改善するために多くの方法を試しました。行のすべての値が一意でなければならないことを既に考慮しています(ドメインに含める必要があります)。 ライブラリーなしでこれをどのように改善できますか?Sudokuソルバーが遅い、先に制約を考慮する必要がある
all_distinct(X) :-
sort(X, Sorted),
length(X, OriginalLength),
length(Sorted, SortedLength),
OriginalLength == SortedLength.
good_by_coulmns(Solution) :- length(Solution, Length),
forall((between(1, Length, X), get_column(Solution, X, Y)),
all_distinct(Y)).
get_area(Solution, X, Y, Z) :- length(Solution, Length),
SQRootF is sqrt(Length),
SQRoot is round(SQRootF),
MinCol is SQRoot * (X-1) + 1,
MinRow is SQRoot * (Y-1) + 1,
matrix_block(MinRow, MinCol, SQRoot, SQRoot, Solution, A), flatten2(A,Z).
good_by_areas(Solution) :- length(Solution, Length),
SQRootF is sqrt(Length), SQRoot is round(SQRootF),
forall((between(1, SQRoot, X), between(1, SQRoot, Y), get_area(Solution, X, Y, Z)),
all_distinct(Z)).
createRow(Solution, Domain, Row) :- maplist(member, Row, Domain),
all_distinct(Row),
good_by_coulmns(Solution).%, write(Solution), nl.
tryToSolve(Domains, Solution) :- length(Solution, L), length(Domains, L), !,
maplist(createRow(Solution), Domains, Solution),
good_by_coulmns(Solution),
good_by_areas(Solution).
必要であれば、私は行方不明のルールを与えることができますが、これは細かいSOFAR働いているので、私たちは、ビルディングブロックとしてこれらを使用することができます。
サイドバーを見ると、PrologベースのSudokuソルバーについて説明する他の10の質問が表示されます。私はそれらのコードを見て、あなたが借りることのできるアプローチについて何かを見つけることができるかどうかを確認することを強くお勧めします。また、プロシージャのプロファイルを立てて、どのコールが高価であるかを把握できるかどうかを確認すると便利です。直感は、パフォーマンスの最適化に関してはほとんど常に間違っています。 –