クイックリファレンス: 解
Sol クラスは QUBO 問題の解を表します。 変数の割り当てとエネルギー値、求解時間を格納します。
Sol の作成
| 式 | 説明 |
|---|---|
Sol(expr) | 式 expr に対するすべてゼロの解を作成 |
変数値の取得
| 式 | 戻り値の型 | 説明 |
|---|---|---|
sol(x) | int | Var x を評価(0 または 1 を返す) |
sol(t) | int | Term t を評価 |
sol(f) | int | Expr f を評価 |
配列の場合は要素ごとにアクセスします:
for i in range(n):
print(sol(x[i]))
変数値の設定
| 式 | 説明 |
|---|---|
sol.set(x, value) | 変数 x を value(0 または 1)に設定 |
sol.set(other_sol) | 別の Sol からすべての変数値をコピー |
sol.set([(x, val), ...]) | ペアのリストから変数値を設定 |
sol.set([other_sol, [(x, val), ...]]) | Sol からコピーし、ペアリストを適用 |
sol.set([(x[0], 1), (x[1], 0), (vi, 5)])
set メソッドは self を返すため、チェーンが可能です:
full_sol = Sol(f).set([sol, [(x[0], 1)]])
エネルギーと評価
| 式 | 戻り値の型 | 説明 |
|---|---|---|
sol.energy | int | 格納されたエネルギー値を返す |
sol.comp_energy() | int | 現在の変数値からエネルギーを再計算して格納 |
sol.tts | float | 求解時間(秒) |
sol.energy はソルバーが解を見つけた時点で格納されたエネルギー値を返すプロパティです。 エネルギーの再計算は行いません。 sol.set() で変数値を変更した後は、格納されたエネルギーは無効になります。 この状態で sol.energy にアクセスするとエラーが発生します。 sol.comp_energy() を呼んでエネルギーを再計算・更新してからアクセスしてください。
解からの整数の抽出
onehot_to_int() — ワンホットデコード
| 式 | 戻り値の型 | 説明 |
|---|---|---|
qbpp.onehot_to_int(sol(x)) | Array | 最後の軸に沿ってワンホットをデコード(デフォルト) |
qbpp.onehot_to_int(sol(x), k) | Array | 軸 $k$ に沿ってワンホットをデコード |
指定された軸に沿ってデコードし、次元が1つ少ない配列を返します。 出力形状は入力形状から軸 $k$ を除いたもので、各要素はその軸に沿った1のインデックスです。 負のインデックスもサポートされています(例: -1 = 最後の軸)。 有効なワンホットベクトルでないスライスに対しては $-1$ を返します。
詳細と例については ワンホットから整数への変換 を参照してください。
ソルバー情報
ソルバーの結果クラス(EasySolverSol、ExhaustiveSolverSol、ABS3SolverSol)は Sol を継承し、 info で追加情報を提供します。
| 式 | 戻り値の型 | 説明 |
|---|---|---|
sol.info | dict | ソルバー情報のキーバリューペア |
sol.sols() | list[Sol] | 収集された全解 |
sol.size() | int | 収集された解の数 |
sol[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)