2017-05-28 7 views
0

週末には、進化的アルゴリズムを使用して改善されたニューラルネットワークを構築しようとしました。私はopenai(https://www.openai.com/)のカートン環境で5000世代借りて行ったが、それは本当にうまくいっていない。ニューラルネットワークは4入力、3単位の1隠れ層、1出力を持ち、ネットワークは活性化関数としてtanHを使用します。世代ごとに100人がおり、そのうち5人が次世代を形成するために選ばれ、突然変異の可能性は20%です。ここではより良い理解のためのコードは次のとおりです。進化的アルゴリズムが改善されていない

import operator 
import gym 
import math 
import random 
import numpy 
import matplotlib.pyplot as plt 

env = gym.make('CartPole-v0') 

generations = 100 
input_units = 4 
Hidden_units = 3 
output_units = 1 
individuals = 100 

fitest1 = [] 
fitest2 = [] 

def Neural_Network(x, weights1, weights2): 
    global output 
    output = list(map(operator.mul, x, weights1)) 
    output = numpy.tanh(output) 
    output = list(map(operator.mul, output, weights2)) 
    output = sum(output) 
    return(output) 

weights1 = [[random.random() for i in range(input_units*Hidden_units)] for j in range(individuals)] 
weights2 = [[random.random() for i in range(Hidden_units*output_units)] for j in range(individuals)] 

fit_plot = [] 

for g in range(generations): 
    print('generation:',g+1) 
    fitness=[0 for f in range(individuals)] 
    prev_obs = [] 
    observation = env.reset() 
    for w in weights1: 
     print('  individual ',weights1.index(w)+1, ' of ', len(weights1)) 
     env.reset() 
     for t in range(500): 
      #env.render() 
      Neural_Network(observation, weights1[weights1.index(w)], weights2[weights1.index(w)]) 
      action = output < 0.5 
      observation, reward, done, info = env.step(action) 
      fitness[weights1.index(w)]+=reward 
      if done: 
       break 
     print('  individual fitness:', fitness[weights1.index(w)]) 
    print('min fitness:', min(fitness)) 
    print('max fitness:', max(fitness)) 
    print('average fitness:', sum(fitness)/len(fitness)) 
    fit_plot.append(sum(fitness)/len(fitness)) 
    for f in range(10): 
     fitest1.append(weights1[fitness.index(max(fitness))]) 
     fitest2.append(weights2[fitness.index(max(fitness))]) 
     fitness[fitness.index(max(fitness))] = -1000000000 


    for x in range(len(weights1)): 
     for y in range(len(weights1[x])): 
      weights1[x][y]=random.choice(fitest1)[y] 
      if random.randint(1,5) == 1: 
       weights1[random.randint(0, len(weights1)-1)][random.randint(0, len(weights1[0])-1)] += random.choice([0.1, -0.1]) 

    for x in range(len(weights2)): 
     for y in range(len(weights2[x])): 
      weights2[x][y]=random.choice(fitest2)[y] 
      if random.randint(1,5) == 1: 
       weights1[random.randint(0, len(weights1)-1)][random.randint(0, len(weights1[0])-1)] += random.choice([0.1, -0.1]) 

plt.axis([0,generations,0,100]) 
plt.ylabel('fitness') 
plt.xlabel('generations') 
plt.plot(range(0,generations), fit_plot) 
plt.show() 

env.reset() 
for t in range(100): 
    env.render() 
    Neural_Network(observation, fitest1[0], fitest2[0]) 
    action = output < 0.5 
    observation, reward, done, info = env.step(action) 
    if done: 
     break 

そして、誰もが疑問に思うならば、世代にわたる平均適応度のグラフか質問がまだ残っている場合As you can see, the algorithm is not improving

(私は唯一の100世代のこの時間のためにそれを実行しました) 、ただ聞いてください。

+0

どのように個人を選んだのですか?どのようにオフスプリングの重量を取得しますか? – blckbird

+0

53行目から69行目をご覧ください。 –

+0

私はPythonでそれほど良くありませんので、本当に助けてもらえませんが、[Neataptic](https://github.com/wagenaartje/neataptic)のソースコードを見てください - 多分あなたは問題を見つけるでしょう。 –

答えて

0

私の意見は、進化的アルゴリズムでは、EAの最後に正しい人物を選んでいないということです。最良の2人の個人を選んでいることを確認してください(1人でしか働かないかもしれませんが、それよりも優れていたいと思っています:))。これは望ましい結果を改善するはずです:)

関連する問題