【发布时间】:2011-04-26 10:23:26
【问题描述】:
我正在创建一个 C 程序来播放 Gomoku。它使用Minimax 搜索来决定最佳移动。但是,它只能搜索 10 秒的最佳着法。如何确定我的搜索功能何时搜索了 10 秒。如果您能给我提供一个示例或文档链接,将不胜感激。
【问题讨论】:
标签: c algorithm time minimax gomoku
我正在创建一个 C 程序来播放 Gomoku。它使用Minimax 搜索来决定最佳移动。但是,它只能搜索 10 秒的最佳着法。如何确定我的搜索功能何时搜索了 10 秒。如果您能给我提供一个示例或文档链接,将不胜感激。
【问题讨论】:
标签: c algorithm time minimax gomoku
唯一的时间检查是行不通的! 极小值是一种递归深度优先搜索算法,它可以花费例如当有一些明显好得多的动作时,30 秒检查非常错误的动作,并且在最后 1 秒内找到一些好的动作!
你必须使用一些算法,它可以在短时间内找到相当好的棋步,然后随着时间的增加,它会改进解法!您必须将您的极小极大(或 alpha-beta)算法修改为 广度优先搜索 策略。然后你可以在任何时候通过相当好的动作来削减它。
【讨论】:
我认为您的问题不在于时间函数本身。您提到了递归的 Minmax 算法。最小最大算法的停止标准是给定的搜索深度。如果您喜欢基于时间的停止标准,您应该使用 Iterative Deepening 框架扩展您的算法,并让递归 Minmax 函数在时间结束时返回 Sentinel Value。
【讨论】:
您可以使用alarm 信号。只需让信号处理程序设置一个名为 okWereDoneNow 的全局标志,然后开始搜索、检查并重置它。
与计时器函数相比,它的优点是每次搜索迭代只需要一次比较。信号工作很昂贵,但只运行一次。在密集的、可能受 CPU 限制的重复操作中,这可能是一个显着优势。但不要相信我的话 - 测试!
【讨论】:
您可以在 time.h 中使用 time() 函数。通常,返回值以秒为单位。即使不是,您也可以简单地使用同一个标头中的 difftime() 。
This 是有关必要功能的好资源。
以上链接来自一个 C++ 参考站点,但该标题和示例都是 C 代码。
【讨论】:
#include <time.h>
time_t start_time = time(NULL);
while (((int)(time(NULL) - start_time)) < 10) {
//search
}
也就是说,我想到了什么。但它没有经过测试。
【讨论】:
while(!foundOptimalMove && ... time stuff ...)