クイックリファレンス: 解
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) | 変数 x を value(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$ を返します。
詳細と例については ワンホットから整数への変換 を参照してください。
ソルバー情報
ソルバーの結果クラス(EasySolverSol、ExhaustiveSolverSol、ABS3SolverSol)は 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)