Prolog 中的 Tron lightcycles AI

Posted

技术标签:

【中文标题】Prolog 中的 Tron lightcycles AI【英文标题】:Tron lightcycles AI in Prolog 【发布时间】:2011-11-15 10:03:59 【问题描述】:

我无法将 AI 写入游戏(例如 tron lightcycles)。 我使用 ncurses 在 C 上编写所有图形和动作。 现在我需要在序言上写下机器人的 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 中的分析函数将返回某个方向(左、下、上或右)保存到文件中并 我的 c 程序读取此文件并移动机器人。

所以我有一个问题 - 我如何在 Prolog 中分析这个矩阵。 我读了一些关于 min-max 算法的东西,但我无法在 Prolog 中意识到这一点。 任何人都可以帮助或指导如何使工作最小最大算法 我的矩阵和 Prolog 中的当前位置?

【问题讨论】:

为什么不能在 Prolog 中使用 minimax? 我可以使用。但我不知道该怎么做。 获取一份 Ivan Bratko 的 Prolog Programming for Artificial Intelligence,其中包含对 Prolog 中 minimax 的解释。 【参考方案1】:

我不确定 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。我们可以将最小-最大搜索重新表述为最大搜索。每个玩家都是最大化者。

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)

上述谓词将完全在 Arguments 中对游戏进行建模,因此游戏状态将存储在局部变量中。然后通过以下谓词“分析”游戏:

% 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。

【讨论】:

以上是关于Prolog 中的 Tron lightcycles AI的主要内容,如果未能解决你的问题,请参考以下文章

列表替换中的 Prolog 元素

Prolog中的展平列表[重复]

PROLOG 中的垂直斜线函数到底是啥?是运营商吗?

Prolog中的双向链表

删除 Prolog 中的单引号/引号

Prolog中的“逻辑纯度”是啥意思?