Amplify-BBOpt とは

はじめに

材料開発や製品設計における最適化や、種々のパラメトリックスタディでは、「シミュレーションや実験の試行回数が限られており、最適化のための十分な試行錯誤ができない」という課題に直面することがよくあります。

Amplify-BBOpt は、そうしたブラックボックス最適化問題を、イジングマシン を活用して効率的に解くための Python ライブラリです。

本ドキュメントでは、ブラックボックス最適化の基本から、Amplify-BBOptの特長とその使い方まで、イジングマシン未経験の技術者にも分かりやすく解説します。

ブラックボックス最適化とは?

ブラックボックス最適化とは、「目的関数の中身が不明(または複雑すぎて扱えない)」な場合に、シミュレーションや実験結果を繰り返しながら最適な入力パラメータ(決定変数)を見つける最適化手法です。

応用例(CAE分野)

  • 空調性能を最大化する建物形状や機器配置の最適化

  • 物質濃度をより均一(濃度変動の最小化)にするための撹拌条件の探索

  • ある性能指標を最大化するための合成材料の組成の最適化

  • 構造物の変位を最小化するための部材配置や荷重条件の調整

  • ある実験結果を実現するための条件の探索(結果の差異の最小化、逆問題)

このような問題では、1回の評価(シミュレーションや実験)が比較的高コストなため、限られた回数で効率よく探索することが求められます。

Hint

Amplify-BBOpt では、最小化問題(目的関数を最小化するようにパラメータを決定する)を実行します。最大化問題を解く場合は、本来の目的関数の負値を考慮することで、最小化問題へ変換します。

イジングマシンとは?

イジングマシンとは、組合せ最適化問題を効率的に解くために設計された専用の計算機です。量子アニーリング(D-Wave など)や、最先端の半導体に基づく量子インスパイアード技術(Fixstars Amplify など)があります。

実用化されているいくつかのマシンは、大規模かつ比較的制約の多い最適化問題の求解も可能で、既に日々のビジネスの場で活用され始めています。

Amplify-BBOptの概要と特長

Amplify-BBOpt は、ブラックボックス最適化を以下のように簡単に実行できます。

  • 最適化対象の関数(シミュレーションや実験)を Python で記述

    → 評価関数の中で外部の CAE を呼び出し実行したり、実験条件を表示します。

  • イジングマシンが最適なパラメータを効率よく探索

    → 膨大なパラメータ数であっても、少ない試行回数で、より良い結果が得られます。

  • 過去の結果を活かし、次に試す条件を自動で提案

    → シミュレーションや実験の評価結果に基づいて、より有望な条件を次々と自動で提示します。

実装されている最適化手法

Amplify-BBOpt は、イジングマシン活用のブラックボックス最適化 (QA-BBO[1]) に基づく複数の手法が実装されており、現時点では、

  • Factorization Machine with Quadratic-Optimization Annealing (FMQA) [2]

  • Polynomial-Based Kernel with Quadratic-Optimization Annealing (Kernel-QA) [3]

を考慮可能です。

QA-BBO の利点として比較的大規模なブラックボックス最適化問題に強いということが挙げられます。従来手法では「次元の呪い」により困難であった高次元問題や、複雑な制約条件を考慮した最適化問題において、特に高性能であることが示されています [4]

Note

Amplify-BBOpt は、組合せ最適化問題の定式化とイジングマシンなどの外部ソルバーによる実行を支援する Python ライブラリ である Amplify SDK をバックエンドに利用しています。

実装例

以下は Amplify-BBOpt の実装例です。

from amplify import FixstarsClient
from amplify_bbopt import blackbox, KMTrainer, Optimizer, RealVariable, IntegerVariable BinaryVariable


# 決定変数とブラックボックス関数の定義
@blackbox
def blackbox_func(
    x0: float = RealVariable(bounds=(0, 2.5)),
    x1: int = IntegerVariable(bounds=(1, 4)),
    x2: int = BinaryVariable(),
) -> float:
    # 実際には CAE などをここで呼び出し、その結果や後処理結果を返却
    return simulate(x0, x1, x2)


# 最適化クラスの設定と最適化の実行
optimizer = Optimizer(
    blackbox=blackbox_func,
    trainer=KMTrainer(),  # サロゲートモデルの選択
    client=FixstarsClient(),  # イジングマシンの選択
)

optimizer.add_random_training_data(num_data=2) # 初期学習データの生成と追加(2サンプル)

optimizer.optimize(num_iterations=10) # 最適化サイクル 10 回の実行


# (3) 最適化結果の表示
print(f"{optimizer.best=}")