我正在用pygame制作一款坦克游戏,玩家可以操控坦克在墙壁之间移动并射击其他坦克。
我正在尝试找到一种方法来创建一个神经网络,可能使用强化学习来控制敌方坦克,这样游戏可以根据每个对象的属性来决定哪些坦克应该移动到哪里,是否应该射击等。
属性:敌人 -> x,y,宽度,高度,速度,健康和其他项目 墙 -> x,y,宽度,高度 子弹 -> x,y,宽度,高度,速度 玩家 -> x,y,宽度,高度,速度,健康
我计划使用keras Python模块来创建神经网络,但是我找不到一种方法来设置输入数据,使其形状和大小正确,因为墙壁和子弹的数量是可变的。
我想做的是:
action = Network.predict(state)
其中state = (Enemy, Player, Tuple_of_Wall_Data, Tuple_of_Bullet_Data)
而action是敌人应该移动的方向的选项,形式为action = (Direction,Should_Shoot)
简而言之,我的问题是,如何设置神经网络的输入层,使其能够接受(1个敌人,1个玩家,多个墙壁,多个子弹),并使用强化学习训练神经网络,给敌人提供一个方向和是否应该开火的指示?
回答:
有三种典型的表示游戏状态的方法供AI代理使用:
-
内部游戏状态,基本上是你提议的 – 游戏中对象的列表及其原始属性。如果你想用机器学习来处理这个,你需要一种能够处理不同大小的架构,因此你可能会使用递归神经网络,一次处理一个对象。请注意,这可能是一种非常低效的表示方式。特别是作为人类,你不会得到这样的游戏状态,你不会得到一个对象流。
-
全局地图视图。如果游戏的地图足够小,可以整体作为输入馈送到代理中,最终得到一个完全可观察的问题,数据形式为W x H x K,其中W,H是地图的宽度和高度,K是对象类型的数量(因此你得到每个对象的一热编码)
-
代理的“视野”,这可能是现代RL中最流行的一种方法,代理再次以W x H x K的形式呈现,但现在W和H是其视野的大小(随代理移动)。