Tron在Prolog中轻骑行AI

时间:2011-09-12 14:40:30

标签: algorithm prolog artificial-intelligence minmax

我有把问题写到游戏中的问题(比如tron lightcycles)。 我使用ncurses在C上编写所有图形和动作。 现在我需要在prolog上写下bot的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函数会将某个方向(向左,向下,向上或向右)保存到文件中 我的程序读取此文件并移动机器人。

所以我有一个问题 - 如何在Prolog中分析这个矩阵。 我读了一些关于min-max算法的内容,但我在Prolog中无法实现这一点。 任何人都可以帮助或显示如何使工作min max算法的方向 我的矩阵和Prolog中的当前位置?

1 个答案:

答案 0 :(得分:2)

我不确定min-max是否会导致tron的良好结果。因为在网格上有一个 通常很多可交换的动作,炸毁了搜索空间。也许是一个小的 字段和/或小搜索深度。但你可以尝试使用否定作为失败 对于min-max,你可以免费获得alfa-beta修剪(我猜是这样)。

在没有不确定性的游戏中,最小 - 最大算法计算最小的对手增益,假设另一方面对手试图最大化他的增益。让我超越对手的移动范围和对手的移动。这导致递归公式如下:

Worst-Opponents-Gain = min_i (max_j ( Worst-Opponents-Gain_i_j) )

由于我们处理零和游戏,对手获得的是我们的胜利。这样我们就有了Opponents-Gain = - Win。我们可以将最小 - 最大搜索重新制定为最大搜索。每个玩家都是最大化者。

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,_)).

您可能希望添加其他参数以限制搜索深度或返回 对此举的象征性重复。

再见

P.S。:你找到了一个井井有条的例子here