CP ソルバー — Google OR-Tools CP-SAT(PyQBPP のみ)¶
このページは 制約プログラミング (CP) のバックエンドを扱います.これは QUBO/HUBO を直接扱うサンプラ(QUBO/HUBO ソルバー)でも MILP ソルバー(MILP ソルバー)でもありません.CP エンジンは Boolean/整数変数を制約のもとで SAT 風のコアで探索し,証明付きの最適解 を返します.
現在の CP バックエンドは Google OR-Tools CP-SAT のみです.Python パッケージとしてのみ提供されるため,PyQBPP (Python) からのみ 利用可能で, C++ エントリーポイントはありません.
→ PyQBPP のドキュメントを参照してください: CP ソルバー — Google OR-Tools CP-SAT
OR-Tools CP-SAT は各非線形単項を新しい Boolean AND としてエンコードするため,
任意次数の HUBO と 否定リテラル (~x) をネイティブに 扱いながら証明
付きの最適解を返します — この組み合わせを満たす Hi-QUBO の外部ソルバーは
これだけです.
このページは 制約プログラミング (CP) のバックエンドを扱います.これは QUBO/HUBO を直接扱うサンプラ(QUBO/HUBO ソルバー)でも MILP ソルバー(MILP ソルバー)でもありません.CP エンジンは Boolean/整数変数を制約のもとで SAT 風のコアで探索し,証明付きの最適解 を返します.
⚠️ Experimental — PyQBPP のみ. OR-Tools ライブラリ本体は実用に供されて いる製品ですが,PyQBPP 連携は実験的 で,ラッパ API は予告なく変更される 可能性があります.OR-Tools は Python パッケージとしてのみ提供される (
pip install ortools) ため,このソルバーに C++ エントリーポイントは ありません.ソルバー生成時に遅延 import されます.
OrToolsCpSatSolver
Google OR-Tools CP-SAT
は SAT ベースの制約プログラミングエンジン.CP-SAT は二次目的関数を
ネイティブには受け付けないため,PyQBPP は各非線形単項
ℓ_a ℓ_b ... ℓ_k(各 ℓ は x_i または ~x_i)を新しい
Boolean z として z = ℓ_a ∧ ... ∧ ℓ_k で制約し,結果として線形
目的関数を最小化します.HUBO は任意次数で同じエンコーディングが
効き,否定リテラルも CP-SAT の BoolVar.Not() でネイティブに扱われます
(all_positive 展開は不要 — m 個の否定リテラルを含む単項を 2^m 倍に
膨らませずに済みます):
sol = qbpp.OrToolsCpSatSolver(e).search(time_limit=5.0)
これにより OrToolsCpSatSolver は,任意次数の HUBO かつ 否定リテラルを
ネイティブに受け付けながら証明付きの最適解を返せる,PyQBPP 唯一の外部
ソルバーになっています.
search() でよく使う kwargs:
time_limit(秒,parameters.max_time_in_seconds),
thread_count(num_search_workers),log(真偽値).
戻り値の型
OrToolsCpSatSolver は PyQBPP 標準の SolverSol
(EasySolverSol/ABS3SolverSol と同じ型) を返すため,プログラムの後段は
ソルバー非依存に保てます:
print(sol.energy) # 最良目的関数値
print(sol.tts) # time-to-best-solution (秒)
print(sol.info["solver"]) # "OrToolsCpSatSolver"
for s in sol.sols: # 追加で得られた解
print(s.energy, s.tts)