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

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

Sol の作成

説明
Sol(expr) expr に対するすべてゼロの解を作成

変数値の取得

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(t) / t(sol) int t を評価
sol(f) / f(sol) int f を評価
sol(c) / c(sol) int 制約 c のペナルティを評価

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

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

変数値の設定

説明
sol.set(x, value) 変数 xvalue(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 メソッドは self を返すため、チェーンが可能です:

full_sol = Sol(f).set(sol).set({x[0]: 1})

エネルギーと評価

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

sol.energy はソルバーが解を見つけた時点で格納されたエネルギー値を返すプロパティです。 エネルギーの再計算は行いませんsol.set(x, val) で変数値を変更した後は、格納されたエネルギーは無効になります。 この状態で 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$ を返します。

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

ソルバー情報

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

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

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

キー 説明
"flip_count" 実行された変数フリップの総数
"var_count" モデルの変数数
"term_count" モデルの項数
"version" QUBO++ のバージョン
"cpu_name" CPU モデル名
"hostname" マシンのホスト名
for k, v in sol.info.items():
    print(f"{k} = {v}")

出力

print(sol)

Back to top

Page last modified: 2026.05.12.