【问题标题】:set variable number of input nodes in python neat在python中设置可变数量的输入节点
【发布时间】:2020-10-05 05:33:39
【问题描述】:

我有一个简单的游戏,其中有一个球在屏幕上弹跳,玩家可以左右移动屏幕并向上射箭以弹出球,每次玩家击球时,球会爆裂并分裂成两个较小的球,直到它们达到最小尺寸并消失。 我正在尝试使用基于 python 整洁库的遗传算法和关于 flappy bird 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)))

【问题讨论】:

    标签: python genetic-algorithm


    【解决方案1】:

    这是一个很好的问题,据我通过快速 Google 搜索得知,NEAT 等简单的 ML 算法尚未解决。

    Deep NN 的传统尺寸调整方法(填充、裁剪、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 个输出(左,右)。第一个 NN 为每个球的位置产生一个输出(并且每个球都相同),第二个 NN 获取第一个 NN 的输出并将其转换为一个动作。另外:球的最大数量不必是可显示球的最大数量,也可以限制为 10 个,并且只考虑最近的 10 个球。

    • 您只考虑每个动作方 1 个球(使您的输入为 1 + 2*2)。这可能是考虑每侧最低的球或每侧最近的球。这种预处理可以使这些简单的神经网络任务变得很容易解决。也许您可以在您的测试环境中添加惯性,从而添加非线性,使得总是传送/匆忙到最低的球变得不那么简单。

    • 您将整个观察空间输入 NEAT(或均匀下采样的分数),例如整个游戏在任何分辨率下都是最低的,但仍然是明智的。我知道这个观察空间很大,但是 NEAT 在处理这些空间时效果很好。


    我知道这不是您可能希望的 NEAT 的可变输入大小选项,但如果不显着更改底层 NEAT 算法,我不知道任何此类通用选项/技巧.

    但是,如果有人知道更好的选择,我很高兴得到纠正!

    【讨论】:

    • 非常感谢您的澄清和解释,而且我认为不可能声明可变数量的输入节点所以最后我决定计算从球员到每个球的距离,取最小距离并将玩家的坐标和到最近球的距离声明为输入节点。如果它对某人有帮助,我将代码放在问题中
    猜你喜欢
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 2022-06-22
    相关资源
    最近更新 更多