我正在尝试创建一个遗传算法来训练神经网络,目标是玩游戏蛇.
我遇到的问题是世代的适应性没有提高,它要么仍然保持在不给游戏任何输入的健身,或者只是在第一代之后变得更糟.我怀疑它是神经网络的一个问题,但我不知道它是什么.
24输入节点
2隐藏层
每层8个节点
4个输出节点(蛇可以采取的每个方向一个)
输入是蛇可以看到的每个方向的数组.对于每个方向,它检查距离与墙壁,水果或其自身的距离.最终结果是一个长度为的数组3*8 = 24.
权重和偏差是在创建网络时生成的-1到1之间的随机浮点数.
人口规模:50000
每代选择的父母:1000
每代保持最高:25000(新变量,看到更好的结果)
每个孩子的突变几率:5%
(我尝试了很多不同的尺寸比例,虽然我还不确定它的典型比例是多少.)
我正在使用单点交叉.每一组重量和偏差都在父母之间交叉,并传递给孩子(交叉的每个"版本"一个孩子).
我正在使用我认为轮盘选择来选择父母,我将在下面发布确切的方法.
蛇的适应性计算如下age * 2**score:(不再是更新中的更多信息),其中年龄是蛇存活了多少圈,而得分是它收集的果实数量.
下面是一些伪代码,试图总结我的遗传算法(应该)如何工作:
pop = Population(size=1000)
while True: # Have yet to implement a 'converged' check
pop.calc_fitness()
new_pop = []
for i in range(n_parents):
parent1 = pop.fitness_based_selection()
parent2 = pop.fitness_based_selection()
child_snake1, child_snake2 = parent1.crossover(parent2)
if rand() <= mutate_chance:
child_snake.mutate()
new_pop.append(child_snake1, child_snake2)
pop.population = new_pop
print(generation_statistics)
gen += 1
Run Code Online (Sandbox Code Playgroud)
这是我用来选择父级的方法:
def …Run Code Online (Sandbox Code Playgroud) python neural-network genetic-algorithm python-3.x unsupervised-learning