【要約】QUBO++で覆面算を解く:SEND + MORE = MONEY [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
組合せ最適化における定式化と数値精度の課題。
- ・ペナルティ係数 $P$ が不適切だと、制約を破った方がエネルギーが低くなる「ニセの低エネルギー解」に捕まる。
- ・桁重みやペナルティの積により、係数が32ビット整数を超え、オーバーフローが発生する。
- ・オーバーフローは目的関数を破壊し、真の最適解を得ることを困難にする。
// Approach
以下のステップで問題を解決する。
- all-different制約:異なる文字に異なる数字を割り当て。
- 等式制約:$(SEND + MORE - MONEY)^2 = 0$ を構築。
1.バイナリ変数 $x_{i,j}$ の定義(文字 $i$ に数字 $j$ を割り当て)。
2.制約のペナルティ化:
- one-hot制約:各文字に1つの数字を割り当て。- all-different制約:異なる文字に異なる数字を割り当て。
- 等式制約:$(SEND + MORE - MONEY)^2 = 0$ を構築。
3.高精度モジュール
pyqbpp.c64e64m2 を採用し、64ビット演算でオーバーフローを回避。4.
qbpp.replace を用い、先頭文字が0にならない制約を「変数固定」として実装し、探索空間を削減。// Result
覆面算の唯一の解「9567 + 1085 = 10652」を特定。すべての制約(one-hot, different, equal)においてエネルギー 0 を達成した。64ビット演算の活用により、大きな係数を含む定式化でも精度を維持した探索が可能であることを示した。
Senior Engineer Insight
> 定式化の抽象度が高く、開発体験は極めて良好。数式をそのままコードに落とし込める点は強力。ただし、ペナルティ係数 $P$ の設計は、解の収束性に直結する極めてシビアな作業である。また、実務的な数値計算では、桁重みによるオーバーフローへの警戒が必須。本記事が示す「高精度モジュールの選択」や「変数固定による探索空間の削減」は、実戦的な最適化実装における定石と言える。大規模問題への適用には、計算コストと精度のトレードオフを厳格に評価すべきだ。