支配判定器#
ParetoComparator系のComparator(NSGA2Comparator/HypervolumeComparator/NSGA3Comparator/RNSGA2Comparator/EpsilonDominanceComparator)は、支配関係の定義そのものをDominatorという差し替え可能なコンポーネントに委ねています。Pareto支配以外の選好関係を使いたいときは、これらのComparator本体ではなくdominator引数だけを差し替えればよいです。
Dominatorの役割#
Dominatorが実装を要求するメソッドはdominance_matrix(f, direction=None)の1つだけです。fはshape (n, n_obj)の目的関数値の行列で、D[i, j]が「行iが行jを支配するか」を示すshape (n, n)のブール行列を返します。fはNaNを含まない前提であり、呼び出し側がその保証を担います。
2点だけを比較するdominates(fa, fb, direction=None) -> boolも持ちますが、これはdominance_matrixから導出される既定実装であり、独自にDominatorを実装する際はdominance_matrixさえ実装すればdominatesとの整合性が自動的に保証されます。内部ではfa/fbを2行のスタックにしてdominance_matrixを呼びます。faにNaNが含まれる場合は常にFalse(支配しない)を返す一方、fb側のNaNは+infに置き換えられ「常に支配される」個体として扱われる、という非対称な扱いになっています。
組み込みDominator#
クラス |
パラメータ |
特徴 |
|---|---|---|
|
なし |
標準Pareto支配。全目的で以下、かつ少なくとも1目的で真に小さい場合に支配とみなす(既定) |
|
|
ε-boxに量子化してから内部で |
EpsilonDominatorは、[6]のε-支配を実装したものです。量子化モードは2種類あります。
additive(既定):各目的の箱番号を
floor(f_i / eps_i)で計算するmultiplicative:
floor(log(f_i) / log(1 + eps_i))で計算する。目的関数値が全て正であることが前提で、そうでない場合はValueErrorになる
epsはスカラーまたはshape (n_obj,)の配列で指定し、全要素が正でなければなりません(そうでない場合は構築時にValueError)。
EpsilonDominanceComparatorは、ParetoComparatorのdominator引数にEpsilonDominator(eps, mode)を渡すだけの薄いラッパーです。
注釈
新しいコードでは、ParetoDominator().dominates(...)またはParetoDominator().dominance_matrix(...)を直接使ってください。
独自Dominatorの実装方法#
独自の支配関係が必要な場合は、Dominatorを継承してdominance_matrix()だけを実装すればよいです。次の例は、各目的にスケーリング係数をかけてからPareto支配を適用します。
import numpy as np
from saealib import Dominator, ParetoDominator
class WeightedDominator(Dominator):
"""Applies a scaling factor to each objective, then applies standard Pareto dominance."""
def __init__(self, scale):
self.scale = np.asarray(scale, dtype=float)
self._pareto = ParetoDominator()
def dominance_matrix(self, f, direction=None):
return self._pareto.dominance_matrix(f * self.scale, direction)
EpsilonDominatorと同様に、既存のParetoDominatorへ変換後の値を委譲する実装にすると、直接目的関数値を比較するロジックを自分で書かずに済みます。
関連コンポーネント#
Comparator:
ParetoComparator系のdominator引数からDominatorを注入するNonDominatedSorter:
Dominatorと対になる、フロントへの振り分け方の差し替え点Population:
ParetoArchiveはDominatorを使って非劣解を判定します