混合変数最適化#

Layer 1: Use

連続変数だけでなく、整数変数やカテゴリ変数を含む問題を、saealibで解きます。

minimize()では、アルゴリズム、サロゲートモデル、評価戦略に文字列またはインスタンスを指定できます。このページの例では問題固有の設定だけを追加し、それ以外はすべて既定値を使います。

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

このページを終えると、連続・整数・カテゴリ変数をProblemに定義し、型に対応した探索を実行できます。

通常の連続変数だけなら高レベルAPIを使い、独自の変数や演算子を追加する場合は独自コンポーネントを参照してください。このページではProblemに変数型を定義し、型に対応した組み込み演算子で探索を実行します。

問題を設定する#

設計変数ごとに、連続値、整数値、カテゴリの3種類が混在する目的関数を想定します。

def func(x):
    # x[0]: continuous, x[1]: integer, x[2]: categorical index
    return x[0] ** 2 + (x[1] - 3) ** 2 + (0.0 if x[2] == 1 else 5.0)

x[2]は3つのカテゴリ(0, 1, 2)のいずれかを表す値で、1を選んだときだけペナルティが付きません。

変数の定義#

各次元の型はVariableのサブクラスで指定し、Problemのvariables引数に渡します。

クラス

意味

ContinuousVariable(lb, ub)

連続値。lb/ubを省略した通常のProblemはこの型として扱われる

IntegerVariable(lb, ub)

整数値

CategoricalVariable(categories)

カテゴリのリストから1つを選ぶ

import numpy as np
from saealib import Problem, ContinuousVariable, IntegerVariable, CategoricalVariable

variables = [
    ContinuousVariable(-5.0, 5.0),
    IntegerVariable(0, 10),
    CategoricalVariable([0, 1, 2]),
]

problem = Problem(
    func=func,
    dim=3,
    n_obj=1,
    direction=np.array([-1.0]),
    variables=variables,
)

variablesを渡すと、各要素のlb/ubからProblem.lb/Problem.ubが自動的に導出されるため、lb/ub引数は指定しません。

minimizeを実行する#

from saealib import minimize

result = minimize(problem, max_fe=500, seed=0)
print(result.x, result.f)

GAは、変数の型ごとに専用の交叉と突然変異の演算子(整数用のCrossoverIntegerSBX/MutationIntegerUniform、カテゴリ変数用のCrossoverCategorical/MutationCategorical)を既定で備えており、variablesを渡すだけで型に応じた探索が行われます。

PSOは速度に基づく更新方式のため、整数変数とカテゴリ変数を正しく扱えません。

混合変数問題ではalgorithm='GA'(既定)のまま使ってください。

演算子のカスタマイズ#

整数変数用とカテゴリ変数用の演算子も、GAのキーワード引数で個別に指定できます。

from saealib import (
    GA,
    CrossoverBLXAlpha,
    MutationUniform,
    SequentialSelection,
    TruncationSelection,
    CrossoverIntegerSBX,
    CrossoverCategorical,
    MutationIntegerUniform,
    MutationCategorical,
)

ga = GA(
    crossover=CrossoverBLXAlpha(0.7, 0.4),
    mutation=MutationUniform(0.3),
    parent_selection=SequentialSelection(),
    survivor_selection=TruncationSelection(),
    integer_crossover=CrossoverIntegerSBX(0.7, eta=15.0),
    integer_mutation=MutationIntegerUniform(0.3),
    categorical_crossover=CrossoverCategorical(0.7),
    categorical_mutation=MutationCategorical(0.3),
)

result = minimize(problem, algorithm=ga, max_fe=500, seed=0)

各演算子の詳細はAlgorithmを参照してください。

関連するConceptとReference#