我有一个简单的游戏,其中有一个球在屏幕上弹跳,玩家可以在屏幕上左右移动并向上射箭以弹出球,每次玩家击中球时,球都会爆裂, split 成两个较小的球,直到它们达到最小尺寸并消失。 我正在尝试使用基于 python 整洁库和 flappybird https://www.youtube.com/watch?v=MMxFDaIOHsE&list=PLzMcBGfZo4-lwGZWXz5Qgta_YNX3_vLS2 上的本教程的遗传算法来解决这个游戏。 ,所以我有一个配置文件,其中我必须指定网络中必须有多少个输入节点,我曾想过将玩家的 x 坐标、玩家的 x 坐标和球的 x 坐标之间的距离作为输入玩家的 y 坐标和球的 y 坐标之间的距离。
我的问题是,在游戏开始时我只有一个球,但经过几次移动后,屏幕上可能会有更多球,所以我应该有更多数量的输入节点,屏幕上的球越多我必须向网络提供的输入坐标越多。
config-feedforward.txt 文件
"""
# network parameters
num_hidden = 0
num_inputs = 3 #this needs to be variable
num_outputs = 3
"""
Python文件
for index,player in enumerate(game.players):
balls_array_x = []
balls_array_y = []
for ball in game.balls:
balls_array_x.append(ball.x)
balls_array_x.append(ball.y)
output = np.argmax(nets[index].activate(("there may be a number of variable arguments here")))
#other...
最终代码
for index,player in enumerate(game.players):
balls_array_x = []
balls_array_y = []
for ball in game.balls:
balls_array_x.append(ball.x)
balls_array_y.append(ball.y)
distance_list = []
player_x = player.x
player_y = player.y
i = 0
while i < len(balls_array_x):
dist = math.sqrt((balls_array_x[i] - player_x) ** 2 + (balls_array_y[i] - player_y) ** 2)
distance_list.append(dist)
i+=1
i = 0
if len(distance_list) > 0:
nearest_ball = min(distance_list)
output = np.argmax(nets[index].activate((player.x,player.y,nearest_ball)))
最佳答案
这是一个很好的问题,据我通过 Google 快速搜索得知,NEAT 等简单的 ML 算法尚未得到解决。
传统的深度神经网络调整大小方法(填充、裁剪、RNN、中间层等)显然不能在这里应用,因为 NEAT 显式编码每个神经元和连接。
我也不知道有任何通用方法/技巧可以使传统 NEAT 算法的输入大小可变,坦率地说,我不认为有这样的方法/技巧。虽然我可以想到对算法进行一些更改以使这成为可能,但我认为这对您没有帮助。
在我看来,你有 3 个选择:
您将输入大小增加到算法应跟踪的最大球数,并将不存在的球的 x-diff/y-diff 值设置为否则不可能的数字(例如 -1)。如果球出现,您实际上会为这些 x-diff/y-diff 输入神经元设置值,并在它们消失时再次将它们设置为 -1。然后你让 NEAT 来解决这个问题。还值得考虑连接 2 个独立的 NEAT NN,第一个 NN 有 2 个输入、1 个输出,第二个 NN 有 1 个(玩家位置)+ x(最大球数)输入和 2 个输出(左、右)。第一个神经网络为每个球位置生成一个输出(并且每个球都相同),第二个神经网络采用第一个神经网络的输出并将其转化为 Action 。另外:最大球数不一定是可显示的最大球数,也可以限制为 10 个,并且只考虑最近的 10 个球。
您只考虑每个行动方 1 个球(使您的输入为 1 + 2*2)。这可以考虑每侧最低的球或每侧最近的球。这种预处理可以使这种简单的神经网络任务变得很容易解决。也许您可以在测试环境中添加惯性,从而添加非线性,使得总是传送/匆忙到最低的球变得不那么简单。
您将整个观察空间输入 NEAT(或均匀下采样分数),例如整个游戏的分辨率最低但仍然合理。我知道这个观察空间很大,但是 NEAT 在处理这样的空间方面效果很好。
我知道这不是您可能希望的 NEAT 的可变输入大小选项,但我不知道在不显着改变底层 NEAT 算法的情况下有任何这样的通用选项/技巧.
但是,如果有人知道更好的选择,我很高兴得到纠正!
关于python - 在python中设置可变数量的输入节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64187546/