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