週末には、進化的アルゴリズムを使用して改善されたニューラルネットワークを構築しようとしました。私は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
そして、誰もが疑問に思うならば、世代にわたる平均適応度のグラフか質問がまだ残っている場合
(私は唯一の100世代のこの時間のためにそれを実行しました) 、ただ聞いてください。
どのように個人を選んだのですか?どのようにオフスプリングの重量を取得しますか? – blckbird
53行目から69行目をご覧ください。 –
私はPythonでそれほど良くありませんので、本当に助けてもらえませんが、[Neataptic](https://github.com/wagenaartje/neataptic)のソースコードを見てください - 多分あなたは問題を見つけるでしょう。 –