进化策略之(1+1)-ES

(1+1)-ES与传统的进化策略的区别

( 1 + 1 ) E S (1+1)-ES 与传统的进化策略相比区别较大,它没有初始化种群的一步,而是初始化一条父染色体,并且在整个寻优过程中,只有一条父染色体和一条由其变异生成的子染色体存在。

(1+1)-ES具体步骤

问题:求 y = x sin 10 x + x cos 2 x y=x\sin{10x}+x\cos{2x} [ 0 , 5 ] [0, 5] 上的最大值。
步骤:
1、随机初始化一条父染色体,称其为 p a r e n t parent ,且其上只含有一个基因(表示 x x 值)。
2、将 p a r e n t parent 进行变异操作得到子染色体 c h i l d child
3、求 p a r e n t parent c h i l d child 的适应度(即 x x 对应的 y y 值)。
4、如果 c h i l d child 的适应度大于 p a r e n t parent 的,则用 c h i l d child 代替 p a r e n t parent ,否则保留 p a r e n t parent
5、根据 1 / 5 s u c c e s s f u l    r u l e 1/5 successful\;rule 更新变异强度。
p s 1 / 5 s u c c e s s f u l    r u l e ps:1/5 successful\; rule 是在 1973 1973 年由 R e c h e n b e r g Rechenberg 提出的,如下图所示:还没到收敛的时候(下面左图), 增大变异强度可以使其更快收敛; 如果已经快到收敛了(下面右图), 则需要减小变异强度防止在最优点处震荡。那么该如何判断是否快到收敛了呢?就是如果有 1 / 5 1/5 的变异比原始的 p a r e n t parent 好的话,就是快收敛了(下面右图)。而在左图中, 有一半的可能性比原始 p a r e n t parent 好,另一半则比原始 p a r e n t parent 差,所以还没到收敛。
在这里插入图片描述用一个公式概括为:
σ σ × e x p ( 1 3 × p s p t a r g e t 1 p t a r g e t ) \sigma\leftarrow\sigma\times exp(\frac{1}{3} \times \frac{p_{s}-p_{target}}{1-p_{target}})
其中 p t a r g e t = 1 5 p_{target}=\frac{1}{5}
( 1 + 1 ) E S (1+1)-ES 中,如果 c h i l d child 优于 p a r e n t parent ,则 p s = 1 p_{s}=1 ,否则 p s = 0 p_{s}=0

(1+1)-ES的python程序

import numpy as np
import matplotlib.pyplot as plt

DNA_SIZE = 1             # DNA (real number)
DNA_BOUND = [0, 5]       # solution upper and lower bounds
N_GENERATIONS = 200
MUT_STRENGTH = 5.        # initial step size (dynamic mutation strength)

def F(x): return np.sin(10*x)*x + np.cos(2*x)*x     # to find the maximum of this function

# find non-zero fitness for selection
def get_fitness(pred): return pred.flatten()

def make_kid(parent):
    # no crossover, only mutation
    k = parent + MUT_STRENGTH * np.random.randn(DNA_SIZE)
    k = np.clip(k, *DNA_BOUND)
    return k

def kill_bad(parent, kid):
    global MUT_STRENGTH
    fp = get_fitness(F(parent))[0]
    fk = get_fitness(F(kid))[0]
    p_target = 1/5  # 新产生的子染色体有1/5的概率要优于父染色体
    if fp < fk:     # kid better than parent
        parent = kid
        ps = 1.     # kid win -> ps = 1 (successful offspring)
    else:
        ps = 0.
    # adjust global mutation strength
    MUT_STRENGTH *= np.exp(1/np.sqrt(DNA_SIZE+1) * (ps - p_target)/(1 - p_target))
    return parent

parent = 5 * np.random.rand(DNA_SIZE)   # parent DNA

for _ in range(N_GENERATIONS):
    # ES part
    kid = make_kid(parent)
    py, ky = F(parent), F(kid)       # for later plot
    parent = kill_bad(parent, kid)
发布了36 篇原创文章 · 获赞 1 · 访问量 564

猜你喜欢

转载自blog.csdn.net/qq_36758914/article/details/103356333