0

语境

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

规格

  • 无论以何种方式或何时导致该函数返回,该函数都应返回一个有效的移动。
  • 该函数可能会在超时后返回一点,只要这对用户来说是不明显的(约 100 毫秒)。
  • 如果自定义 AI_INTERRUPT 事件被放置在 pygame 事件队列中,该函数应该返回。(这样不耐烦的用户就可以强制电脑玩了)。

建议实施

我想我知道如何实现这一点,但我在网上发现了很多相互矛盾的建议(主要是针对与这个不太一样的问题)。我也担心我过度设计了一些东西。因此,我在问这个实施建议是否明智,或者您是否推荐其他东西。

我正在考虑将我的 AI 算法编写为一个生成器,以不断产生更好的动作。收益率之间的时间延迟可能很长,但第一次收益率几乎是立竿见影的。

然后我会在一个子进程中调用这个生成器,并让它将产量值输入管道。

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

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

我正在使用 Python 3 和 pygame。

4

3 回答 3

1

您可以使用包装您的 negamax 方法的超时线程。

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

于 2013-03-10T15:24:16.230 回答
0

如果你在 UNIX 上工作,你可以使用信号库来实现一个超时功能:超时功能,如果它需要太长时间才能完成

于 2013-03-10T15:25:19.393 回答
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

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

于 2013-03-10T16:41:49.337 回答