決定変数の作成

決定変数とは、最適化の対象となるブラックボックスな目的関数への入力パラメータです。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]

決定変数の情報

上記のように作成した決定変数は、様々な情報を持ちます。

アトリビュート名

説明

bounds

変数の値域

encoding.method [1]

変数のエンコーディング手法

name [2]

変数名

possible_values

変数の取り得る値

type

変数の種類

>>> 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