首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog语言中的Tron lightcycles

Prolog语言中的Tron lightcycles
EN

Stack Overflow用户
提问于 2011-09-12 22:40:30
回答 1查看 1.6K关注 0票数 1

我在把AI写到游戏上有问题(像tron lightcycles)。我使用ncurses在C上编写所有的图形和动作。现在我需要在prolog上编写机器人的人工智能。我正在使用swi prolog。

我保存当前游戏区域(所有矩阵)、当前人类位置和当前机器人位置(如矩阵单元i,j)。它们像谓词一样保存在c中的.pl文件中。

我的游戏字段是一个矩阵,它包含1和0( 1-已访问,0-未访问)。如下所示:

代码语言:javascript
复制
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]]).

然后我需要像这样分析这个矩阵:

代码语言:javascript
复制
analyze(matrix).

因此,prolog中的分析函数将返回一些方向(向左、向下、向上或向右)保存到文件中,并且我的c程序读取该文件并移动机器人。

所以我有一个问题--我如何用Prolog分析这个矩阵。我读过一些关于min-max算法的文章,但我不能用Prolog实现。有没有人可以帮助或说明如何用我的矩阵和Prolog中的当前位置来做功最小最大算法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-09 03:52:48

我不确定min-max是否会给tron带来好的结果。因为在网格上,一个人通常有许多可交换的移动,这会破坏搜索空间。也许对于较小的范围和/或较小的搜索深度。但是你可以尝试使用否定作为min-max的失败,并且你可以免费获得alfa-beta修剪(我想是这样)。

在没有不确定性的游戏中,最小-最大算法计算对手的最小收益,另一方面,假设对手试图最大化他的收益。让i覆盖玩家的移动,j覆盖对手的移动。这导致了如下的递归公式:

代码语言:javascript
复制
Worst-Opponents-Gain = min_i (max_j ( Worst-Opponents-Gain_i_j) )

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

代码语言:javascript
复制
Best-Win = max_i ( - Best-Win_i).

当您的win值在{-1,0,1}范围内时,您可以使用否定作为失败。只需实现以下谓词即可对游戏进行建模:

代码语言:javascript
复制
% move(+Board,+Player,-Board)  
% init(+Board)  
% win(+Board,+Player)  
% oposite(+Player,-Player)  
% tie(+Board,+Player)

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

代码语言:javascript
复制
% 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,_)).

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

再见

附言:你找到了一个井字游戏的例子here

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7389614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档