如何在python中写入超时的AI函数

时间:2013-03-10 15:19:13

标签: python artificial-intelligence signals multiprocessing pygame

上下文

我正在为python中的确定性双人游戏编写AI。我希望编写一个函数,它将超时值作为其参数之一,并在超时后不久返回一个移动。该函数搜索(negamax或类似)直到超时结束,然后返回它可以找到的最佳移动。

规范

  • 无论何时或何时返回,该函数都应返回有效的移动。
  • 该功能可能会在超时后返回一点,只要这对用户不明显(~100ms)。
  • 如果在pygame事件队列上放置了自定义AI_INTERRUPT事件,则该函数应该返回。 (这样不耐烦的用户就可以强迫计算机玩了。)

建议实施

我想我已经知道如何实现这一点,但我在网上发现了许多相互矛盾的建议(主要是针对与此问题不完全相同的问题)。我也担心我过度工程。因此,我问这个实施建议是否合理,或者你是否推荐其他建议。

我正在考虑将我的AI算法编写为能够连续产生更好动作的生成器。收益率之间的时间延迟可能很长,但第一次收益几乎是即时的。

然后我会在子流程中调用这个生成器,并将它的yield yield值输入管道。

然后主进程将在以下循环中运行:

  • 轮询管道。如果产生了新值,则将其存储。
  • 检查时间。如果超出超时,则返回最新值。
  • 检查AI_INTERRUPT事件,如果找到,则返回最新值。
  • 根据需要处理其他pygame事件

我正在使用Python 3和pygame。

3 个答案:

答案 0 :(得分:1)

您可以使用覆盖您的negamax方法的timed-out thread

到目前为止,该方法将使用最佳解决方案更新共享数据结构。共享数据结构可以简单地是您传递给negamax方法的列表。超时发生时,调用者将从列表中读取解决方案。

答案 1 :(得分:0)

如果您正在使用UNIX,则可以使用信号lib来实现超时功能:Timeout function if it takes too long to finish

答案 2 :(得分:0)

由于您已经在使用pygame,请使用:

def foo(duration):
    # time as MS
    start = pygame.time.get_ticks()
    while True:
        now = pygame.time.get_ticks()
        if now - start >= duration:
            return

        # do stuff

或者这两个功能中的一个:

pygame.time.waitpygame.time.delay

你可以制作一个稍微复杂一点的版本,它仍然可以让你的主循环继续。但如果您的显示器在短时间内没有更新,则可能会有些过度。