決定変数の作成¶
決定変数とは、最適化の対象となるブラックボックスな目的関数への入力パラメータです。Amplify-BBOptは、これらの変数の値を変化させながら、目的関数の出力を最小化するように探索を行います。
決定変数の種類とその定義¶
Amplify-BBOpt では、以下の決定変数を考慮可能です。
バイナリ変数¶
二値 (0 または 1) を取る変数です。BinaryVariable
クラスにより定義します。
>>> from amplify_bbopt import BinaryVariable
>>> q = BinaryVariable()
>>> print(q.possible_values)
[0, 1]
整数変数¶
整数値のみを取る変数です。連続変数と似ていますが、値は整数に限定されます。整数変数は、IntegerVariable
クラスにより定義します。値域を bounds
として引数に渡す必要があります。
>>> from amplify_bbopt import IntegerVariable
>>> n = IntegerVariable(bounds=(0, 5))
>>> print(n.possible_values)
[0, 1, 2, 3, 4, 5]
実数変数¶
実数値を取る変数です。例えば、0.0〜1.0の範囲で連続的に変化するパラメータなどに適用します。実数変数は、RealVariable
クラスにより定義します。値域を bounds
として引数に渡す必要があります。
>>> from amplify_bbopt import RealVariable
>>> x = RealVariable(bounds=(0, 1))
>>> print(x.possible_values)
[0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
離散変数¶
任意に離散化された数をとる変数です。例えば [0.1, 0.3, 0.5, 1.0] の離散値で表現される離散変数は、DiscreteVariable
クラスにより次のように定義します。離散点のリストを values
として引数に渡す必要があります。
>>> from amplify_bbopt import DiscreteVariable
>>> x = DiscreteVariable(values=[0.1, 0.3, 0.5, 1.0])
>>> print(x.possible_values)
[0.1, 0.3, 0.5, 1.0]
Hint
整数変数や実数変数、離散変数は、内部的には変数変換が実施されます。具体的には、整数変数と離散変数においてはエンコーディング、実数変数においてはエンコーディングと離散化が実施されます。
デフォルトでは、エンコーディングに domain-wall 法、離散化の条件として、離散点数 11 点および離散化手法は等間隔 (Uniform) が考慮されます。
EncodingMethod
クラスや DiscretizationSpec
クラスを使うことで、エンコーディング手法や離散点数、離散化の一様性を指定できます。例えば、デフォルトの状態から離散点数のみを変更する場合、以下のように設定します。
>>> from amplify_bbopt import RealVariable, DiscretizationSpec
>>> x = RealVariable(
... bounds=(0, 1),
... discretization_spec=DiscretizationSpec(num_bins=5), # 離散点数を 5 点に変更
... )
>>> print(x.possible_values)
[0.0, 0.25, 0.5, 0.75, 1.1]
より詳細な変数変換に関する情報は、「エンコーディングの種類と設定」を参照してください。
決定変数リスト¶
同一のプロパティを有する複数の決定変数は、次のようにリストを用いて一括で作成することが可能です。
>>> from amplify_bbopt import BinaryVariable
>>> q = [BinaryVariable() for _ in range(5)]
>>> print(len(q))
5
>>> print(q[0].possible_values)
[0, 1]
決定変数の情報¶
上記のように作成した決定変数は、様々な情報を持ちます。
アトリビュート名 |
説明 |
---|---|
|
変数の値域 |
|
変数のエンコーディング手法 |
|
変数名 |
|
変数の取り得る値 |
|
変数の種類 |
>>> from amplify_bbopt import RealVariable, DiscretizationSpec
>>> x = RealVariable(bounds=(0, 1))
>>> print(x.bounds)
(0.0, 1.0)
>>> print(x.encoding.method)
EncodingMethod.DomainWall
>>> print(x.name)
x_2
>>> print(x.possible_values)
[0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
>>> print(x.type)
Real