微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Prolog Chess AI,Alpha Beta 剪枝

如何解决Prolog Chess AI,Alpha Beta 剪枝

我对 Prolog 比较陌生。目前我正在尝试为一个名为 Diana chess 或 Ladies chess (https://en.wikipedia.org/wiki/Minichess) 的 Minichess 游戏做一个 AI。它基本上是国际象棋,但有一个 6x6 的棋盘,你没有皇后,只有一个马。

对于我的 AI,我主要看 Ivan Bratko 的 Prolog 人工智能编程(第 3 版)一书。他在那里展示了 alpha-beta 算法的实现。我也在查看某人发布在 GitHub 上的 Prolog-Code,他在那里为他的跳棋游戏实现了相同的代码。 (https://github.com/migafgarcia/prolog-checkers/blob/master/checkers.pl)

代码应该提前考虑一定数量的转弯,并从中选择最好的一步。在我开始用 Prolog 编程之前,我做了很多 oh Java 编程,这就是为什么我的代码第一行中的“Zug”是 NextMove 的返回。我希望这一切都有意义。

我的问题是,当我运行我的代码时,例如,我让 AI 对抗人类(我),当我以白色开始并执行我的第一步 (b2b3) 时,AI 就无法工作,回溯有点在 NextMove 之前停止,这样我就无法获得最好的移动。此外,当AI为最小玩家考虑并需要选择他的举动时,他总是采取最高价值的举动,但是,当我对算法的理解没有错误时,不应该采取最低价值吗?

我很感激对此的每一条评论或任何反馈。

这是代码https://pastebin.com/sc4gLdQe

alphabeta(Player,MaxiPlayer,Alpha,Beta,Board,NextMove,Eval,Depth) :-
  Depth<2,NewDepth is Depth+1,findall(
     (Player,figur,VonL,VonR,NachL,NachR,Gegner,Board),zugbewegung(Player,Moves
  ),write('All Moves:'),sysoutMoves(Moves),nl,bounded_best(Player,Moves,NewDepth),write('NextMove: '),write(NextMove),!.

alphabeta(Player,_,_) :-
  value(Board,Player),!.

bounded_best(Player,[(Spieler,_)|Moves],BestMove,BestEval,Depth) :-
  sysoutMove((Spieler,_)),ziehen(Board,(Spieler,_),NewBoard),gegner(Player,NextPlayer),alphabeta(NextPlayer,NewBoard,Depth),good_enough(Player,Depth).

good_enough(_,[],_) :- !.

good_enough(Player,Move,_) :-
  minimizing(Player,MaxiPlayer),Eval > Beta,!.

good_enough(Player,_) :-
  maximizing(Player,Eval < Alpha,Depth) :-
  new_bounds(Player,NewAlpha,NewBeta),NewBeta,Move1,Eval1,better_of(Player,BestEval).

new_bounds(Player,Beta) :-
  minimizing(Player,Eval > Alpha,!.

new_bounds(Player,Eval) :-
  maximizing(Player,Eval < Beta,!.

new_bounds(_,Beta).

better_of(Player,Eval2,Eval1) :-
  maximizing(Player,Eval1 >= Eval2,!.

better_of(Player,Move2,Eval2) :-
  maximizing(Player,Eval2 >= Eval1,Eval1) :-
  minimizing(Player,Eval1 =< Eval2,Eval2) :-
  minimizing(Player,Eval2 =< Eval1,!.

maximizing(Player,MaxiPlayer) :-
  Player == MaxiPlayer.

minimizing(Player,MaxiPlayer) :-
  Player \== MaxiPlayer.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。