我遇到一个问题,需要编写一个游戏(类似 Tron 光轮摩托)的 AI。
我已经使用 ncurses 在 C 语言中完成了所有的图形和移动。
现在我需要在 Prolog 上编写机器人的 AI。 我正在使用 swi prolog。
我将当前游戏场(所有矩阵)、当前人类位置和当前机器人位置(例如矩阵单元格 i, j)保存起来。 它们以谓词的形式从 C 语言保存到 .pl 文件中。
我的游戏场是一个包含 1 和 0 的矩阵(1 – 已访问,0 – 未访问)。
像这样:
human_current_position(0,1).
bot_current_position(1,2).
matrix([[1,1,0,0],
[1,1,1,0],
[0,0,0,0],
[0,0,0,0]]).
然后我需要分析这个矩阵,像这样:
analyze(matrix).
因此,Prolog 中的 analyze 函数将返回一些方向(左、下、上或右),保存到文件中,并且我的 C 程序读取该文件并移动机器人。
所以我有一个问题 – 我如何在 Prolog 中分析这个矩阵。
我读过一些关于 min-max 算法的内容,但我无法在 Prolog 中实现它。
是否有人可以帮助或展示如何使用我的矩阵和当前位置在 Prolog 中实现 min max 算法?
回答:
我不确定 min-max 算法是否能为 tron 带来好的结果。 因为在网格上,通常有很多可交换的移动,这会扩大搜索空间。 也许对于一个小场地和/或一个小的搜索深度。 但是你可以尝试使用否定作为失败来实现 min-max,你会免费获得 alfa-beta 剪枝(我猜是这样)。
在没有不确定性的游戏中,min-max 算法计算对手的最小收益,假设对手另一方面试图最大化他的收益。 设 i 表示玩家的移动,j 表示对手的移动。 这将导致以下递归公式:
Worst-Opponents-Gain = min_i (max_j ( Worst-Opponents-Gain_i_j) )
由于我们处理的是零和游戏,对手的收益就是我们的胜利。 因此,我们有 Opponents-Gain = – Win。 我们可以将 min-max 搜索重新制定为 max 搜索。 每个玩家都是一个最大化者。
Best-Win = max_i ( - Best-Win_i).
当您的获胜值在 {-1, 0, 1} 范围内时,您可以使用否定作为失败。 只需实现以下谓词来建模您的游戏:
% move(+Board,+Player,-Board)
% init(+Board)
% win(+Board,+Player)
% oposite(+Player,-Player)
% tie(+Board,+Player)
以上谓词将在参数中完全建模游戏,因此游戏状态将存储在局部变量中。 然后通过以下谓词“分析”游戏:
% best(+Board,+Player,-Board)
best(X,P,Y) :-
move(X,P,Y),
(win(Y,P) -> true;
oposite(P,Q),
\+ tie(Y,Q),
\+ best(Y,Q,_)).
您可能希望添加其他参数来限制搜索深度,或返回移动的符号表示。