Tron 光轮摩托 Prolog AI

我遇到一个问题,需要编写一个游戏(类似 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,_)).

您可能希望添加其他参数来限制搜索深度,或返回移动的符号表示。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注