- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在将 AI 写入游戏(如 tron lightcycles)时遇到了问题。我使用 ncurses 在 C 上编写所有图形和 Action 。现在我需要在序言中写下机器人的人工智能。我正在使用 swi 序言。
我保存当前游戏区域(所有矩阵)、当前人类位置和当前机器人位置(如矩阵单元格 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 中分析这个矩阵。我读了一些关于最小-最大算法的东西,但我无法在 Prolog 中实现这一点。任何人都可以帮助或指导如何使最小最大算法工作我的矩阵和 Prolog 中的当前位置?
最佳答案
我不确定 min-max 是否会为 tron 带来好的结果。因为在网格上有通常有很多交换 Action ,会扩大搜索空间。也许为了小字段和/或小的搜索深度。但是你可以尝试使用否定作为失败对于 min-max,您可以免费获得 alfa-beta 剪枝(我猜是这样)。
在没有不确定性的游戏中,最小-最大算法计算对手的最小增益,假设对手在另一方面试图最大化他的增益。让 i 覆盖玩家的 Action ,j 覆盖对手的 Action 。这导致递归公式如下:
Worst-Opponents-Gain = min_i (max_j ( Worst-Opponents-Gain_i_j) )
由于我们处理的是零和博弈,对手的 yield 就是我们的胜利。这样我们就有了 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 .
关于algorithm - Prolog 中的 Tron lightcycles AI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7389614/
我试图让玩家光轮不停地朝一个方向移动,直到玩家按下按钮将其朝另一个方向移动。我不确定如何用 kbhit 做到这一点,所以请给我一些建议!谢谢。 void Lightcycle(){ if (k
我在将 AI 写入游戏(如 tron lightcycles)时遇到了问题。我使用 ncurses 在 C 上编写所有图形和 Action 。现在我需要在序言中写下机器人的人工智能。我正在使用 swi
我是一名优秀的程序员,十分优秀!