在“人工智能Prolog编程”中实现的极小极大算法 – min_to_move/1 和 max_to_move/1 是什么?

首先我想说,即使没有Prolog经验,AI大神们也可能回答这个问题。

优秀的《人工智能Prolog编程》一书中有一个非常简洁巧妙的极小极大算法实现:

minimax( Pos, BestSucc, Val)  :-  moves( Pos, PosList), !,               % Pos 的合法移动产生 PosList  best( PosList, BestSucc, Val)   ;   staticval( Pos, Val).                 % Pos 没有后继节点:静态评估 best( [ Pos], Pos, Val)  :-  minimax( Pos, _, Val), !.best( [Pos1 | PosList], BestPos, BestVal)  :-  minimax( Pos1, _, Val1),  best( PosList, Pos2, Val2),  betterof( Pos1, Val1, Pos2, Val2, BestPos, BestVal).betterof( Pos0, Val0, Pos1, Val1, Pos0, Val0)  :-        % Pos0 比 Pos1 更好  min_to_move( Pos0),                                    % MIN 在 Pos0 中移动  Val0 > Val1, !                                         % MAX 更喜欢更大的值  ;  max_to_move( Pos0),                                    % MAX 在 Pos0 中移动  Val0 < Val1, !.                                % MIN 更喜欢更小的值 betterof( Pos0, Val0, Pos1, Val1, Pos1, Val1).           % 否则 Pos1 比 Pos0 更好

然而,作者并没有过多地描述它,我想知道 min_to_move/1max_to_move/1 是什么。

谁能为我解释一下这些吗?

提前感谢!


回答:

显然,当且仅当“最小化”玩家需要在位置 Pos 中移动时,min_to_move(Pos) 为真。 max_to_move/1 则相反。 就我个人而言,我发现这里描述的编码风格不是很好。 例如,在几个场合,if-then-else ((->)/2 和 (;)/2) 似乎更适合表达意图。 谓词名称也可以更具描述性(例如考虑使用“positions_best/2”来描述位置列表和最佳选择之间的关系,而不仅仅是“best/3”)并且更具可读性(例如,除了比例如“better_of”更难阅读之外,“betterof”是什么?)。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注