【发布时间】: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