混合変数最適化#
連続変数だけでなく、整数変数やカテゴリ変数を含む問題を、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引数に渡します。
クラス |
意味 |
|---|---|
|
連続値。 |
|
整数値 |
|
カテゴリのリストから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を参照してください。