【问题标题】:prolog alpha-beta unexpected resultsprolog alpha-beta 意外结果
【发布时间】:2021-02-03 19:46:28
【问题描述】:

我已将书中的通用 alpha-beta 修改为深度限制。当打印出最佳位置搜索结果时,它有时会起作用,有时我会得到一个令人讨厌的结果,例如数字 8。

这是来自“人工智能序言”的非常通用的 alpha-beta。我正在尝试缩小问题是否与 alpha-beta 或我的代码中的其他地方有关。

有人可以告诉我这个深度受限的 alpha-beta 是否可行?

代码如下:

alphabeta(Pos, Alpha, Beta, GoodPos, Val, Depth):-
   Depth > 0,
   moves(Pos, PosList), !,
   boundedbest(PosList, Alpha, Beta, GoodPos, Val, Depth);
   get_pos_value(Pos,Val).                              % static value of position

boundedbest([Pos | PosList], Alpha, Beta, GoodPos, GoodVal, Depth):-
   NewDepth is Depth - 1,
   alphabeta(Pos, Alpha, Beta,_,Val, NewDepth),
   goodenough(PosList, Alpha, Beta, Pos, Val, GoodPos, GoodVal, Depth).

goodenough([],_,_,Pos, Val, Pos, Val,_):- !.                % no other candidate

goodenough(_,Alpha,Beta, Pos, Val, Pos, Val,_) :-
   min_to_move(Pos), Val > Beta, !;                 % Maximizer attainded upper bound
   max_to_move(Pos), Val < Alpha,!.                 % Minimizer attained lower bound

goodenough(PosList, Alpha, Beta, Pos, Val, GoodPos, GoodVal, Depth):-
   newbounds(Alpha, Beta, Pos, Val, NewAlpha, NewBeta), % refine bounds
   boundedbest(PosList, NewAlpha, NewBeta, Pos1, Val1, Depth),
   betterof(Pos,Val, Pos1, Val1, GoodPos, GoodVal).

newbounds(Alpha, Beta, Pos, Val, Val, Beta):-
   min_to_move(Pos), Val > Alpha, !.                    % Maximizer increased lower bound

newbounds(Alpha, Beta, Pos, Val, Alpha, Val):-
   max_to_move(Pos), Val < Beta, !.                 % Minimizer decreased upper bound

newbounds(Alpha, Beta, _, _ , Alpha, Beta).             % otherwise bounds unchanged

betterof(Pos, Val,Pos1, Val1, Pos, Val):-               % Pos better than Pos1
   min_to_move(Pos), Val > Val1,!;
   max_to_move(Pos), Val < Val1,!.

betterof(_,_,Pos1,Val1,Pos1,Val1).                      % Otherwise Pos1 better

【问题讨论】:

  • 我讨厌成为一个固执己见的人,但这不是一个精心设计的 SO 问题。您可以将其发布在 Stack Exchange 的“代码审查”上;或者您可以调试您的代码,尝试尽可能地靠自己,然后重新制定您的问题,以便可以在不费力气的情况下对其进行调查。至少,你应该展示你是如何运行你的代码的,说出你期望的结果,出乎意料的结果等等。 (顺便说一句,很多不寻常的编写代码(剪切,分号......)我猜这在你使用的原始代码中是这样的?)
  • 您的代码不完整:什么是 min_to_move 和 max_to_move ?确定是否有必要切割,例如在betterof,或者goodenough第二个子句中。
  • Min to move 检查是否变黑,max to move 检查是否变白。 move() 匹配所有下一个合法棋盘位置

标签: prolog minimax alpha-beta-pruning


【解决方案1】:

这里有一些关于这些谓词 goodenough 和 betterof 的 cmets,它们的写法相同。我想当 Val > Val1 或 Beta 时,您需要 min_to_move,而在 Val

goodenough(_,Alpha,Beta, Pos, Val, Pos, Val,_) :-
   min_to_move(Pos), Val > Beta, !;                 % Maximizer attainded upper bound
   max_to_move(Pos), Val < Alpha,!.                 % Minimizer attained lower bound

betterof(Pos, Val,Pos1, Val1, Pos, Val):-           % Pos better than Pos1
   min_to_move(Pos), Val > Val1,!;
   max_to_move(Pos), Val < Val1,!.

也许写得更明确:

goodenough(_,Alpha,Beta, Pos, Val, Pos, Val,_) :-
    Val > Beta, !,
    min_to_move(Pos).
goodenough(_,Alpha,Beta, Pos, Val, Pos, Val,_) :-
    Val < Alpha, !,
    max_to_move(Pos).

这段代码表明有些情况没有被你的析取处理好, 解释为失败。这是故意的吗?

在 goodenough/8 中,如果参数 5 Val 与参数 7 Val 不同,则谓词失败。这是故意的吗?

我的印象是你提前优化了代码!

【讨论】:

  • 是的,这就是它在“人工智能的序言编程”一书中的显示方式,我添加了 Depth 参数以允许更浅的搜索。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 2012-10-09
  • 2018-09-04
  • 2017-06-02
  • 2021-11-11
相关资源
最近更新 更多