支配判定器#

Layer 2: Compose

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#

クラス

パラメータ

特徴

ParetoDominator

なし

標準Pareto支配。全目的で以下、かつ少なくとも1目的で真に小さい場合に支配とみなす(既定)

EpsilonDominator

eps, mode="additive"

ε-boxに量子化してから内部でParetoDominatorに委譲する

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を使って非劣解を判定します

参照#