萌えハッカーニュースリーダー

2025/07/26 16:47 Optimi-Zi(n)g Sudoku-Solving

出典: https://log.pfad.fr/2025/optimi-zig-sudoku-solving/
hakase
博士

ロボ子、今日のITニュースは数独ソルバーの最適化の話じゃ。

roboko
ロボ子

数独ですか、面白そうですね! どのような内容なのでしょうか?

hakase
博士

Olivier氏がZigで書いた数独ソルバーを、これでもかと最適化した記録らしいぞ。アルゴリズムはDancing Links (DLX)というのを使うらしい。

roboko
ロボ子

Dancing Linksですか。初めて聞きました。

hakase
博士

数独をexact-cover問題に変換して、0と1の行列で表現するのじゃ。行列の列が制約、行が部分的な解を表すらしい。

roboko
ロボ子

なるほど。数独のセルに数字を割り当てるのが、制約を満たすことに相当するんですね。

hakase
博士

そうそう。初期実装では、各セルに対して`allocator.create()`を呼んでて、平均1msで解けてたらしい。

roboko
ロボ子

1msですか。十分速い気もしますが、最適化の余地があるんですね。

hakase
博士

そこからがすごいんじゃ。まず、1行の4つのセルを一度に割り当てることで、0.54msに短縮!

roboko
ロボ子

一気に半分近くまで速くなったんですね!

hakase
博士

さらに、すべてのセルを一度に割り当てると0.46ms、ArrayListのサイズを事前割り当てすると0.30msじゃ。

roboko
ロボ子

事前割り当ては効果的なんですね。

hakase
博士

`Doptimize=ReleaseFast`フラグを使うと、なんと0.13ms!

roboko
ロボ子

コンパイラ最適化も重要ですね。

hakase
博士

DLX構造体を「unmanaged」で使って、ヒープを使わずスタックのみを使うようにしたり、最初から入ってる数字を考慮して不要なセルのセットアップをスキップしたり…

roboko
ロボ子

細かいチューニングも積み重ねているんですね。

hakase
博士

最終的には、Zig 0.14.1にアップグレードしたら、平均0.061ms/puzzleになったらしいぞ!

roboko
ロボ子

すごい! 初期の1msから考えると、16倍以上速くなっているんですね。

hakase
博士

しかも、マルチスレッドで20スレッド使うと、1秒あたり約138kパズルも解けるらしい。

roboko
ロボ子

それは驚異的なスピードですね。数独ソルバーでそんなに最適化できるとは思いませんでした。

hakase
博士

じゃろ?最適化って奥が深いんじゃ。私も見習わないとな。

roboko
ロボ子

そうですね。私も勉強になりました。ところで博士、数独は得意ですか?

hakase
博士

私にかかれば、数独なんて一瞬…って、あれ?鉛筆がない!

roboko
ロボ子

(苦笑)まずは鉛筆を見つけるところからですね。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search