因此,我建立了一个进化神经网络算法,该算法播放准系统版本的“ Flappy Bird”。
一切正常,并且立即收敛为“完美”的解决方案。...太完美了...所以我有一个假设,为什么它学习基本没有代代相传的最优策略(我会在最后提到它为首先,我想向您展示我的结果。
再次..这是重量初始化后立即进行的。
注意:模型固定为3个输入层,2个隐藏层,1个输出(跳跃或不跳跃)。
因为这是一个简单的问题,所以我选择不使用像glorot这样的特殊初始化方法,而是从均匀分布中退出。
def randomize_net(self):
self.layer_weights = []
for i in range(len(NET_DIMS)-1):
self.layer_weights.append(
np.random.uniform(
size=(NET_DIMS[i], NET_DIMS[i+1])
)
)
def look(self, pipe: Pipe):
# Get distance from the pipe's X
x_dist = pipe.pos[0] - self.pos[0]
if x_dist < 0:
x_dist = 0
# Get distance from pipe's upper bound
y_upper_dist = (pipe.pos[1] + HALF_GAP) - self.pos[1]
# Get distance from pipe's lower bound
y_lower_dist = (pipe.pos[1] - HALF_GAP) - self.pos[1]
self.vision = [
x_dist,
y_upper_dist,
y_lower_dist
]
def think(self):
# Calculate the network's output.
output = self.vision
l = len(self.layer_weights)-1
for i, weight_layer in enumerate(self.layer_weights):
output = np.matmul(output, weight_layer)
# Activate all layer outputs EXCEPT output layer.
if i != l:
self.activate_layer(output)
self.net_outputs = output
我希望这些鸟至少经过几代的反复试验才能学习,但是它们第一次反应完美。
之所以将其带入StackOverflow是为了查看我的模型是否混乱,但由于特殊情况而无法正常工作。
我相信可能与Y距离乘以0有关。如果将权重乘以0的Y距离,则可能会向前传播,尽管权重值仍然小于0.5(我的阈值)。
我可能还有一段路要走,我什至不确定那是否有意义。但是,我喜欢局外人的观点,所以请分享您的想法。
顺便说一句,它是开源的,因此,如果您想自己here it is来运行它。