正の値 0→∞ の正規化されたフィットネス関数を作成する必要があります。0→0、1→1、∞→0のように(入力→出力)から実験してみたいと思います。私の数学は少し苦手で、これが難しいことではないことを期待してください。
そのため、関数の出力は 0 に大きく偏っており、最大出力 1 を生成する入力値を変更できる必要があります。
三角分布のような線形関数を作成できますが、入力が区別される最大値を設定する必要があります (その値を超えると、すべてが同じように見えます)。2 つの単純な式を次のようなものとマージすることもできます。 :
from matplotlib import pyplot as plt
import numpy as np
from math import exp
def frankenfunc(x, mu):
longtail = lambda x, mu: 1 / exp((x - mu))
shortail = lambda x, mu: pow(x / mu, 2)
if x < mu:
return shortail(x, mu)
else:
return longtail(x, mu)
x = np.linspace(0, 10, 300)
y = [frankenfunc(i, 1) for i in x]
plt.plot(x, y)
plt.show()
これは問題なく動作するはずです。特に、返される実際の値はバイナリ トーナメントで使用されるため、それほど重要ではありません。それでも醜いので、可能であれば scipy などの統計分布を柔軟に使用したいと思います。