X 秒后中止函数 - lisp
Abort function after X seconds - lisp
我一直在寻找一种在 lisp 上 X 秒后停止功能的方法,但我没有找到任何东西,也不知道该怎么做。
它用于寻找俄罗斯方块游戏函数的启发式权重,如果权重不好,程序会 运行 超过 30 秒,我不希望这样。有什么想法吗?
一种可能的方法是传递一个"expiry timer"并在每次迭代中检查当前时间是否晚于到期时间,如果已经过期,return目前最好的解决方案.标准函数 get-universal-time
可能很有用,但会为您提供最小的秒数粒度。下面是一个粗略的骨架。如果您使用递归函数,只需将到期计时器与您传递的任何其他内容一起传递下去,并将其用作您的第一个递归终止条件。
(defun do-tetris-stuff (tetris-weights expiry-time)
(let ((best-solution nil))
(loop while (and (<= expiry-time (get-universal-time))
(not (good-enough-p best-solution)))
do (let ((next-solution ...))
(when (better-than-p next-solution best-solution)
(setf best-solution next-solution))))
best-solution))
Common Lisp 有一个库:Trivial Timeout.
API很简单:Trivial Timeout API.
我一直在寻找一种在 lisp 上 X 秒后停止功能的方法,但我没有找到任何东西,也不知道该怎么做。
它用于寻找俄罗斯方块游戏函数的启发式权重,如果权重不好,程序会 运行 超过 30 秒,我不希望这样。有什么想法吗?
一种可能的方法是传递一个"expiry timer"并在每次迭代中检查当前时间是否晚于到期时间,如果已经过期,return目前最好的解决方案.标准函数 get-universal-time
可能很有用,但会为您提供最小的秒数粒度。下面是一个粗略的骨架。如果您使用递归函数,只需将到期计时器与您传递的任何其他内容一起传递下去,并将其用作您的第一个递归终止条件。
(defun do-tetris-stuff (tetris-weights expiry-time)
(let ((best-solution nil))
(loop while (and (<= expiry-time (get-universal-time))
(not (good-enough-p best-solution)))
do (let ((next-solution ...))
(when (better-than-p next-solution best-solution)
(setf best-solution next-solution))))
best-solution))
Common Lisp 有一个库:Trivial Timeout.
API很简单:Trivial Timeout API.