Minimax算法:成本/评估功能?

时间:2010-06-08 23:44:54

标签: algorithm artificial-intelligence evaluation minimax

学校项目让我用C ++编写日期游戏(例如http://www.cut-the-knot.org/Curriculum/Games/Date.shtml),计算机玩家必须使用alpha-beta修剪实现Minimax算法。到目前为止,我理解算法背后的目标是在最大化潜在收益方面,同时假设对手将其缩小。

但是,我读过的资源都没有帮助我理解如何设计评估函数,minimax基于它的所有决策。所有示例都为叶节点分配了任意数字,但是,我需要为这些节点实际分配有意义的值。

Intuition告诉我,对于胜利的叶子节点来说它会是+ 1,对于丢失来说是-1,但是中间节点如何评估呢?

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

最基本的minimax仅评估叶节点,标记胜利,损失和绘制,并在树上备份这些值以确定中间节点值。在游戏树难以处理的情况下,您需要使用截止深度作为minimax函数的附加参数。达到深度后,您需要为不完整状态运行某种评估函数。

极小极大搜索中的大多数评估功能都是特定于域的,因此寻找特定游戏的帮助可能很困难。请记住,评估需要返回某种特定玩家获胜位置的百分比预期(通常是最大值,但不是在使用negamax实现时)。几乎没有研究过的游戏会与另一个更加研究的游戏非常相似。这个与游戏pickup sticks密切相关。仅使用minimax和alpha beta,我猜这个游戏很容易处理。

如果你必须为非终端位置创建一个评估函数,这里有一些帮助分析棒游戏,你可以决定它是否对日期游戏有用。

通过查看终端位置以及可能导致该位置的所有动作,开始寻找强制结果的方法。在棒球游戏中,终端位置在最后一次移动时剩余3根或更少的棒。因此,立即进入该终端位置的位置将留下4支给你的对手。现在的目标是让你的对手无论如何都会留下4支球,这可以通过5,6或7支球棒留给你,并且你想强迫你的对手离开你的其中一个位置。你的对手需要在5,6或7中所需的位置是8.继续这个逻辑并且一个模式变得非常快。总是给你的对手留下一个可以被4整除的数字而你赢了,其他的,你输了。

这是一个相当简单的游戏,但确定启发式的方法很重要,因为它可以直接应用于您的任务。由于最后一次移动是第一次,并且你一次只能改变1个日期属性,你知道要赢得那里需要剩下2个移动......依此类推。

祝你好运,让我们知道你最终在做什么。

答案 1 :(得分:3)

评估函数的最简单情况是获胜+1,失败为-1,任何未完成位置为0。鉴于你的树足够深,即使这个简单的功能也会给你一个好的玩家。对于任何具有高分支因子的非平凡游戏,通常需要更好的功能,并且需要一些启发式(例如,对于国际象棋,您可以为棋子分配权重并找到总和等)。在Date游戏的情况下,我只使用最简单的评估函数,所有中间节点都为0。

作为旁注,minimax不是这个特定游戏的最佳算法;但我想你已经知道了。

答案 2 :(得分:0)

根据我对您所关联的日期游戏的理解,似乎玩家唯一可能的结果是赢或输,中间没有(如果我错了请纠正我)。

在这种情况下,只需将值1分配给获胜位置(当前玩家获得至12月31日),将值-1分配给失败位置(其他玩家将获得至12月31日)。 / p>

你的minimax算法(没有alpha-beta修剪)看起来像这样:

A_move(day):
   if day==December 31:
       return +1
   else:
       outcome=-1
       for each day obtained by increasing the day or month in cur_date:
           outcome=max(outcome,B_move(day))
       return outcome

B_move(day):
   if day==December 31:
       return -1
   else:
       outcome=+1
       for each day obtained by increasing the day or month in cur_date:
           outcome=min(outcome,A_move(day))
       return outcome