Amplify-BBOpt 全体像¶
最適化処理フロー¶
Amplify-BBOpt では、逐次最適化手法を用いてブラックボックス最適化を実現します。
下図の最適化処理フローに示す通り、逐次最適化手法では、最適化サイクルを複数回実行することで最適化を進めます。また、下図 ② のモデル関数の最小化では、量子・量子インスパイアード技術に基づくイジングマシンを活用します。
実行手順¶
Amplify-BBOpt の全体像と実行手順について説明します。以下のようなステップに沿ってブラックボックス最適化を実行することができます。
- (1) 決定変数の生成
まず、決定変数を作成します。
- (2) 目的関数の定義
次に、ブラックボックスな目的関数を Amplify-BBOpt に準備された
@blackbox
デコレータを使って作成します。ブラックボックスな目的関数の中身は、数値シミュレーションや実験計測及び関連する後処理等になります。- (3) 最適化の実行
- (4) 結果の評価
結果は、
Optimizer
のアトリビュートや最適化履歴として取得できます。
Hint
必要に応じて、上記ステップ (2) 以降で、決定変数に対する制約条件を与えることも可能です。その場合、与えられた制約を満たすように最適化が実施されます。
実装例¶
以下は、流体デバイスの設計において「抵抗力を最小化する」ことを目的としたブラックボックス最適化の実装例です。
ブラックボックスな目的関数 my_blackbox_func
内では、シミュレーターである仮の外部モジュール DragSimulator
を使い、流れ場に設置された物体抵抗を計算するシミュレーションを実施します。
その結果に基づき目的関数値(抵抗力)を最小化する設計パラメータを探索し、抵抗力が小さい、効率的な流体デバイスの設計パラメータを得ることができます。
import DragSimulator # 仮のシミュレータークラス
from amplify import FixstarsClient
from amplify_bbopt import blackbox, KMTrainer, Optimizer, RealVariable
# (1) 決定変数の作成と (2) ブラックボックス関数の定義
@blackbox
def my_blackbox_func(
width: float = RealVariable(bounds=(1, 20)),
height: float = RealVariable(bounds=(1, 5)),
angle: float = RealVariable(bounds=(0, 45)),
) -> float:
"""シミュレーションで得られた物体に働く抵抗力を返却."""
drag_force = DragSimulator(width, height, angle).simulate()
return drag_force
# (3) 最適化クラスの設定と最適化の実行
optimizer = Optimizer( # 最適化クラスのインスタンス化
blackbox=my_blackbox_func,
trainer=KMTrainer(), # サロゲートモデルの選択
client=FixstarsClient(), # イジングマシンの選択
)
optimizer.add_random_training_data(num_data=2) # 初期学習データサンプルの追加
optimizer.optimize(num_iterations=10) # 最適化サイクル 10 回の実施
# 最適化結果の表示
print(f"{optimizer.best=}")