クイックリファレンス: 解

Sol クラスは QUBO 問題の解を表します。 変数の割り当てとエネルギー値、求解時間を格納します。

Sol の作成

式 説明
Sol(expr) 式 expr に対する、すべての変数が 0 の解を作成(ネイティブ整数変数は下限の値)

変数値の取得

Var / Term / Expr(通常の式・整数変数・制約式のいずれも)に対して、sol(x) と x(sol) は同じ値を返します。 加えて、sol[x] は sol(x) の省略形です。

式 戻り値の型 説明
sol(x) / x(sol) / sol[x] int 変数 x の値を取得(0 または 1)
sol(vi) / vi(sol) / sol[vi] int 整数変数 vi の整数値を取得
sol.get(x) int 変数 x(Var またはネイティブ整数変数)の値を取得(sol(x) と同じ)
sol(t) / t(sol) int 項 t を評価
sol(f) / f(sol) int 式 f を評価
sol(c) / c(sol) int 制約 c のペナルティを評価

解のモデル(ソルバーに渡した式)に含まれていない変数を読み出したり、そのような変数を含む式を評価したりすると、RuntimeError になります。 replace で値を固定した変数は、固定したあとの式の解には含まれないので、qbpp.Sol(f).set(sol, ml) で元の式 f の解に戻してから読み出します。 sol.has(x) で、変数がモデルに含まれているか確認できます。

配列の場合は要素ごとにアクセスします:

for i in range(n):
    print(sol[x[i]])

変数値の設定

式 説明
sol.set(x, value) 変数 x を value(0 または 1、整数変数なら整数)に設定
sol.flip(x) バイナリ変数 x の値を反転(0 ↔ 1)。格納されたエネルギーは無効になる。ネイティブ整数変数には使えない
sol.set(other_sol) 別の解からすべての変数値をコピー
sol.set({x: val, ...}) 辞書で変数値を一括設定
sol.set([(x, val), ...]) タプルリストで変数値を一括設定
sol.set(other_sol, {x: val, ...}) 別の解からコピーし、辞書で上書き
sol.set(other_sol, [(x, val), ...]) 別の解からコピーし、タプルリストで上書き
sol.set(x[0], 1)
sol.set(x[1], 0)
sol.set(vi, 5)

# 辞書で一括設定
sol.set({x[0]: 1, x[1]: 0, vi: 5})

set・flip メソッドは self を返します。replace で変数を固定した式の解 sol から元の式 f の解を作るには、set(sol, ml) を使います:

full_sol = qbpp.Sol(f).set(sol, ml)

ml の値には ~x[1] のような式も書け、その値は sol の変数値で評価されます。 解を渡さない set({x: val, ...}) では値は整数でなければならず、式を書くと TypeError になります。

エネルギーと評価

式 戻り値の型 説明
sol.energy int 格納されたエネルギー値を返す
sol.comp_energy() int エネルギーを返す(無効な場合のみ再計算)
sol.tts float 求解時間(秒)

sol.energy はソルバーが解を見つけた時点で格納されたエネルギー値を返すプロパティです。 エネルギーの再計算は行いません。 sol.set(x, val) や sol.flip(x) で変数値を変更した後は、格納されたエネルギーは無効になります。 この状態で sol.energy にアクセスするとエラーが発生します。 sol.comp_energy() を呼んでエネルギーを再計算・キャッシュしてからアクセスしてください。 エネルギーが既に有効な場合、comp_energy() は再計算せずにキャッシュ値を返します。

解からの整数の抽出

onehot_to_int() — ワンホットデコード

式 戻り値の型 説明
qbpp.onehot_to_int(sol(x)) array 最後の軸に沿ってワンホットをデコード(デフォルト)
qbpp.onehot_to_int(sol(x), axis=k) array 軸 $k$ に沿ってワンホットをデコード

指定された軸に沿ってデコードし、次元が1つ少ない配列を返します。 出力形状は入力形状から軸 $k$ を除いたもので、各要素はその軸に沿った1のインデックスです。 負のインデックスもサポートされています(例: -1 = 最後の軸)。 有効なワンホットベクトルでないスライスに対しては $-1$ を返します。

詳細と例については ワンホットから整数への変換 を参照してください。

ソルバー情報

ソルバーの結果クラス(EasySolverSol、ExhaustiveSolverSol、ABS3SolverSol)は Sol を継承し、 info で追加情報を提供します。

式 戻り値の型 説明
sol.info dict ソルバー情報のキーバリューペア
sol.sols list[Sol] 収集された全解
sol.size int 収集された解の数
sol.sols[i] Sol $i$ 番目の解にアクセス

info 辞書はソルバーのメタデータを文字列のキーバリューペアとして格納しています。 代表的なキー:

キー 説明
"flip_count" 実行された変数フリップの総数(ABS3Solver では "total_flip_count")
"var_count" モデルの変数数
"term_count" モデルの項数
"version" QUBO++ のバージョン
"cpu_name" CPU モデル名
"hostname" マシンのホスト名

返されるキーはソルバーによって異なります。たとえば ExhaustiveSolver は flip_count・version・cpu_name・hostname を返しません(ネイティブ整数変数を含むモデルでは var_count・term_count も返しません)。 どのキーがあるかは、全エントリを反復して確認できます:

for k, v in sol.info.items():
    print(f"{k} = {v}")

出力

print(sol)

変数の割り当てを含む人間が読みやすい形式で表示されます。 表示の例は クイックリファレンス: 表示 を参照してください。


Back to top

Page last modified: 2026.10.14.

© 2026 中野浩嗣, 広島大学