python - 在python中设置可变数量的输入节点

标签 python genetic-algorithm

我有一个简单的游戏,其中有一个球在屏幕上弹跳,玩家可以在屏幕上左右移动并向上射箭以弹出球,每次玩家击中球时,球都会爆裂, split 成两个较小的球,直到它们达到最小尺寸并消失。 我正在尝试使用基于 python 整洁库和 flappybird https://www.youtube.com/watch?v=MMxFDaIOHsE&list=PLzMcBGfZo4-lwGZWXz5Qgta_YNX3_vLS2 上的本教程的遗传算法来解决这个游戏。 ,所以我有一个配置文件,其中我必须指定网络中必须有多少个输入节点,我曾想过将玩家的 x 坐标、玩家的 x 坐标和球的 x 坐标之间的距离作为输入玩家的 y 坐标和球的 y 坐标之间的距离。

我的问题是,在游戏开始时我只有一个球,但经过几次移动后,屏幕上可能会有更多球,所以我应该有更多数量的输入节点,屏幕上的球越多我必须向网络提供的输入坐标越多。

那么如何以可变的方式设置输入节点的数量呢? enter image description here

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/

相关文章:

python - 将分布拟合到 scipy 中的计数器

python - 连接到本地 mysql 数据库时 manage.py 检查失败

python, "urlparse.urlparse(url).hostname"返回无值

从字典中访问任意元素的 Pythonic 方式

python - 如何从USB运行Python?

algorithm - 使用遗传算法选择稀疏参数

genetic-algorithm - 用于频率检测的遗传算法方法(在光电体积描记图中)

math - 遗传算法的适应度函数和选择

artificial-intelligence - 我在哪里可以通过真实世界示例获得对所有人工智能技术的非常简单的介绍

selection - 如何在遗传算法中执行基于等级的选择?