如何解决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 举报,一经查实,本站将立刻删除。