進化戦略(µ,λ ) -ES pythonコード実装を添付
21830 ワード
ESアルゴリズムモデル個体表示 適応度評価 変異 交差 選択 個体の表示方法個体は2 n次元ベクトルであり、実数解xと標準差sigmaからなる:X={x,sigma}そのうち、x=[x 1,x 2,・・,xn]は個体特徴、すなわち遺伝子を表す. ベクトルxは探索空間の1つの点、すなわち実数解である.ベクトルsigmaは変異進化に用いる正規分布の標準差である.
てきおうどひょうか目標関数f(x)を適応度関数F(x): 目標関数f(x)は正または負の値をとり、その値を大きさ比較のみして優劣を決定する.適応度評価は選択操作のみに関連し,その結果はある選択操作に用いられる.
変異sigmaを変異する:
さらにXi個体を変異させる:
次の方法を選択します.(1+1)—ES:登山法 (1,1)—ES:ランダムサーチ法 (µ+1)—ES:隣接探索法 (µ,1)—ES:隣接探索法 ( µ + λ ) — ES:最適個体を保持するマルチポイント探索法 ( µ , λ ) — ES:多点探索法 本文は使用しました(µ,λ ) 親μ個体から子個体を先に産生した. さらに子孫個体の中から最も適応度の良い個体を新たな親個体として選択した. ( µ , λ )選択はλ子個体で行うと,親のある個体の適応度が他の個体よりも大きく高くても,次世代まで子として生き残ることができず,探索が発散する可能性があるため,適応値関数が時変の場合とマルチプロセッサ並列計算にのみ用いられる.
結果:マルチピーク関数の最大値を計算します.
質問があれば、多くの交流~他の関連進化アルゴリズム(GA、ES、CMA-ES、EPなど)を更新した~
てきおうどひょうか
f ( x ) = F ( x )
変異sigmaを変異する:
sigma_temp = theta * sigma[:, pos[0]] + (1 - theta) * sigma[:, pos[1]]
さらにXi個体を変異させる:
son_temp = out + sigma_temp * np.random.normal([2, 1])
次の方法を選択します.
結果:マルチピーク関数の最大値を計算します.
import numpy as np
"""
ES-
(μ,λ) - ES λ μ
"""
# ratio
ratio = 7
#
step = 0
#
E_MAX = 38.80
#
N = 80
# x1、x2
res_x_y = []
#
bound_x1 = [-0.3, 12.1]
bound_x2 = [4.1, 5.8]
# x1、x2
# sigma
# [2,N]
X = np.random.random([2, N]) # ,
X[0] = (bound_x1[1] - bound_x1[0]) * X[0] + bound_x1[0]
X[1] = (bound_x2[1] - bound_x2[0]) * X[1] + bound_x2[0]
#
MAX_FITNESS = 0
#
GEN = 200
# sigma
sigma = np.random.randn(2, N)
# theta
theta = 0.5
# out
out = np.zeros([2])
# son
son = np.zeros([2, ratio * N])
# fits
fits = np.zeros(son.shape[1])
#
def F(x1, x2):
return 21.5 + x1 * np.sin(4 * np.pi * x1) + x2 * np.sin(20 * np.pi * x2)
if __name__ == '__main__':
while True:
lamda = 1
while lamda < ratio * N:
# X
pos = np.random.randint(0, N - 1, [1, 2])[0]
#
index1 = X[:, pos[0]]
index2 = X[:, pos[1]]
#
# random 0-1
if np.random.random() < 0.5:
out[0] = index1[0]
else:
out[0] = index2[0]
if np.random.random() < 0.5:
out[1] = index1[1]
else:
out[1] = index2[1]
# sigma
sigma_temp = theta * sigma[:, pos[0]] + (1 - theta) * sigma[:, pos[1]]
# sigma
#
son_temp = out + sigma_temp * np.random.normal([2, 1])
#
if bound_x1[0] <= son_temp[0] <= bound_x1[1] and bound_x2[0] <= son_temp[1] <= bound_x2[1]:
#
son[:, lamda] = son_temp
lamda += 1
#
for j in range(son.shape[1]):
x1 = son[:, j][0]
x2 = son[:, j][1]
fits[j] = F(x1, x2)
#
arg = np.argsort(fits)
# fitness N
X = son[:, arg[(ratio - 1) * N:ratio * N]]
# x、y
res_x_y = X[:, -1]
MAX_FITNESS_TEMP = F(res_x_y[0], res_x_y[1])
#
if MAX_FITNESS < MAX_FITNESS_TEMP:
MAX_FITNESS = MAX_FITNESS_TEMP
if MAX_FITNESS > E_MAX:
break
print(MAX_FITNESS)
step += 1
print(" :")
print("step:" + str(step))
print("x:" + str(res_x_y[0]))
print("y:" + str(res_x_y[1]))
print(MAX_FITNESS)
質問があれば、多くの交流~他の関連進化アルゴリズム(GA、ES、CMA-ES、EPなど)を更新した~