進化戦略(µ,λ ) -ES pythonコード実装を添付


ESアルゴリズムモデル
  • 個体表示
  • 適応度評価
  • 変異
  • 交差
  • 選択
  • 個体の表示方法
  • 個体は2 n次元ベクトルであり、実数解xと標準差sigmaからなる:X={x,sigma}そのうち、x=[x 1,x 2,・・,xn]は個体特徴、すなわち遺伝子を表す.
  • ベクトルxは探索空間の1つの点、すなわち実数解である.ベクトルsigmaは変異進化に用いる正規分布の標準差である.

  • てきおうどひょうか
  • 目標関数f(x)を適応度関数F(x):
                          f ( x ) = 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])
    

    次の方法を選択します.
  • (1+1)—ES:登山法
  • (1,1)—ES:ランダムサーチ法
  • (µ+1)—ES:隣接探索法
  • (µ,1)—ES:隣接探索法
  • ( µ + λ ) — ES:最適個体を保持するマルチポイント探索法
  • ( µ , λ ) — ES:多点探索法
  • 本文は使用しました(µ,λ )
  • 親μ個体から子個体を先に産生した.
  • さらに子孫個体の中から最も適応度の良い個体を新たな親個体として選択した.
  • ( µ , λ )選択はλ子個体で行うと,親のある個体の適応度が他の個体よりも大きく高くても,次世代まで子として生き残ることができず,探索が発散する可能性があるため,適応値関数が時変の場合とマルチプロセッサ並列計算にのみ用いられる.

  • 結果:マルチピーク関数の最大値を計算します.
    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など)を更新した~