高レベルAPIで最適化を実行する#

Layer 1: Use

前提は、目的関数と設計変数の範囲が決まっていることです。

このページでできるようになること

このページを終えると、最小化または最大化を実行し、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 は既定で全目的を最大化します。

要件

呼び出し

追加の指定

すべて最小化

minimize(...)

なし

すべて最大化

maximize(...)

なし

Problemで方向を定義済み

minimize(problem) または maximize(problem)

Problem の方向が使われる

複数目的の方向を混在させる

minimize(..., direction=[...])

目的ごとに 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 に進みます。

関連するConceptとReference#