1

我正在尝试实现一个人工智能来解决一个简单的任务:从 A 移动到 B,同时避开障碍物。

到目前为止,我使用pymunkpygame构建了环境,并且效果很好。但现在我面临下一步:为了获得强化学习算法的奖励,我需要检测玩家与墙壁之间的碰撞。或者只是在撞到墙壁/障碍物时重新启动环境。

设置c_handler.begin函数等于Game.restart函数帮助我打印出玩家实际击中了什么东西。

但除了print()我无法访问与玩家位置有关的任何其他功能,我真的不知道下一步该做什么。

那么如何使用 pymunk 碰撞重启环境呢?还是有其他方法可以重置甚至其他库来构建适当的环境?

def restart(self, arbiter, data):
    car.body.position = 50, 50
    return True 

def main(self):
[...]
c_handler = space.add_collision_handler(1,2)
c_handler.begin = Game.restart
[...]  
4

1 回答 1

0

一般来说,阅读一些关于类在 python 中的工作方式,特别是类实例变量的工作方式似乎对您很有用。

无论如何,如果您已经知道要操作 car 变量,则可以将其存储在类本身中。然后,由于您在重新启动方法中有 self 可用,您可以在那里做任何事情。

或者,另一种选择是从传递给回调的仲裁器中找出要更改的主体。

选项1:

class MyClass:

    def restart(self, space, arbiter, data):
        self.car.body.position = 50,50
        return True

    def main(self):
        [...]
        self.car = car
        c_handler = space.add_collision_handler(1,2)
        c_handler.begin = self.restart
        [...]

选项2:

def restart(space, arbiter, data):
    arbiter.shapes[0].body.position = 50,50
    # or maybe its the other shape, in that case you should do this instead
    # arbiter.shapes[1].body.position = 50,50
于 2019-01-01T19:27:15.860 回答