高レベルAPIで最適化を実行する#
前提は、目的関数と設計変数の範囲が決まっていることです。
このページでできるようになること
このページを終えると、最小化または最大化を実行し、Result から解と実行状況を取得できます。
基本的な問題を高レベルAPIで実行するページとして、構成要素を個別に選ぶ場合は ビルトインコンポーネントの差し替え を参照してください。 世代ごとの状態取得や細かな構成が必要なら 低レベルAPI に進みます。
Problemを準備する#
目的関数を受け取る高レベルAPIでは、dim、lb、ub を同時に渡します。 目的関数は、設計変数の配列を受け取り、スカラーまたは目的数に対応する配列を返します。
import numpy as np
from saealib import minimize
def objective(x):
return np.sum(x**2)
result = minimize(
objective,
dim=3,
lb=[-5.0, -5.0, -5.0],
ub=[5.0, 5.0, 5.0],
max_fe=100,
seed=0,
verbose=False,
)
Problemをすでに構築している場合は、そのインスタンスを第一引数に渡します。目的方向、変数、制約についてはProblemの概念を参照してください。正規インポートのページにインポートの選択肢をまとめています。
minimizeとmaximizeを選ぶ#
目的方向が一つなら、関数名で実行の意図を表せます。 minimize は既定で全目的を最小化し、maximize は既定で全目的を最大化します。
要件 |
呼び出し |
追加の指定 |
|---|---|---|
すべて最小化 |
|
なし |
すべて最大化 |
|
なし |
|
|
|
複数目的の方向を混在させる |
|
目的ごとに |
実行を制御する#
max_fe は真の目的関数評価の上限です。 省略時は 200 * dim が使われます。 pop_size は集団サイズ、seed は初期化に使う乱数シード、verbose=False は世代ログの抑制に使います。
アルゴリズム、Surrogate、Strategyをビルトインコンポーネントから選ぶ場合は、文字列またはインスタンスを algorithm、surrogate、strategy に渡せます。 選択と差替えの手順は ビルトインコンポーネントを差し替える に分けています。
strategy引数には2つの有効なモードがあります。文字列の短縮表記"ib"、"gb"、"ps"でも、Strategyインスタンスでも、Strategyを明示するとバンドル済みプリセットのevaluation_plannerとfeedback_builderは適用されず、Strategy自身の既定ポリシーが使われます。strategyを省略すると、バンドル済みプリセットがRatioEvaluationやComparatorWorstFallback(MixedFeedback)を含む標準構成を提供します。どちらも正しい動作なので、使いたい構成に応じて選べます。
Resultを読む#
minimize() と maximize() は Result を返します。 単目的では result.x が最良設計変数、result.f が要素数1の配列として対応する目的値を保持します。 result.fe は真の評価回数、result.gen は完了した世代数です。 多目的では x と f がPareto解の行列になります。
print(result.x)
print(result.f)
print(result.fe, result.gen)
archive = result.ctx.archive
print(archive.get_array("x"))
result.ctx は完全な OptimizationState です。 世代ごとの状態取得、途中の停止、コンポーネントの組み立てが必要になったら 低レベルAPI に進みます。