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 (将#修改为@)