Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 极小极大算法:成本/评估函数? 一个学校项目让我在C++中编写一个日期游戏(例子AT),在那里计算机玩家必须用Alpha beta修剪实现一个极大极小算法。到目前为止,我理解了算法背后的目标是什么,即最大化潜在收益,同时假设对手将最小化潜在收益_Algorithm_Artificial Intelligence_Evaluation_Minimax - Fatal编程技术网

Algorithm 极小极大算法:成本/评估函数? 一个学校项目让我在C++中编写一个日期游戏(例子AT),在那里计算机玩家必须用Alpha beta修剪实现一个极大极小算法。到目前为止,我理解了算法背后的目标是什么,即最大化潜在收益,同时假设对手将最小化潜在收益

Algorithm 极小极大算法:成本/评估函数? 一个学校项目让我在C++中编写一个日期游戏(例子AT),在那里计算机玩家必须用Alpha beta修剪实现一个极大极小算法。到目前为止,我理解了算法背后的目标是什么,即最大化潜在收益,同时假设对手将最小化潜在收益,algorithm,artificial-intelligence,evaluation,minimax,Algorithm,Artificial Intelligence,Evaluation,Minimax,然而,我所阅读的资源中没有一个能帮助我理解如何设计评估函数——极大极小值是它所有决策的基础。所有示例都为叶节点分配了任意数字,但是,我需要实际为这些节点分配有意义的值 直觉告诉我,赢的叶子节点是+1,输的是-1,但是中间节点是如何计算的呢 任何帮助都将不胜感激。评估函数最简单的情况是赢+1,输+1,未完成的位置为0。如果你的树足够深,即使这个简单的函数也会给你一个好的玩家。对于任何具有高分支因子的非平凡游戏,通常需要一个更好的函数,并使用一些启发式方法(例如,对于国际象棋,您可以为棋子分配权重并

然而,我所阅读的资源中没有一个能帮助我理解如何设计评估函数——极大极小值是它所有决策的基础。所有示例都为叶节点分配了任意数字,但是,我需要实际为这些节点分配有意义的值

直觉告诉我,赢的叶子节点是+1,输的是-1,但是中间节点是如何计算的呢


任何帮助都将不胜感激。

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


顺便说一句,对于这个特殊的游戏,minimax并不是最好的算法;但是我想你已经知道了。

最基本的minimax只计算叶节点,标记赢、输和平局,并将这些值备份到树上以确定中间节点的值。在博弈树难以处理的情况下,需要使用截止深度作为minimax函数的附加参数。一旦达到深度,就需要对不完整状态运行某种求值函数

极小极大搜索中的大多数求值函数都是特定于域的,因此很难找到特定游戏的帮助。请记住,评估需要返回某个特定玩家(通常是最大值,但在使用negamax实现时不是这样)对该位置的某种百分比期望。几乎所有研究较少的游戏都将与另一个研究较多的游戏非常相似。这一点与游戏密切相关。仅使用minimax和alpha beta,我猜游戏是可处理的。

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

开始寻找一种方法,通过观察一个终端位置和所有可能导致该位置的移动来强制一个结果。在棍棒游戏中,一个终点位置是最后一步剩下3根或更少的棍棒。因此,立即进入终点位置的位置将向你的对手留下4根棍子。现在的目标是让你的对手在任何情况下都有4根棍子,这可以通过让你有5根、6根或7根棍子来完成,你想迫使你的对手在这些位置中的一个位置上离开你。你的对手需要的位置是8,这样你才能进入5、6或7。继续这种逻辑,模式很快就会变得可用。总是给你的对手留下一个可以被4整除的数字,你赢了,否则你输了。

这是一个相当琐碎的游戏,但确定启发式的方法很重要,因为它可以直接应用于您的作业。因为最后一步先走,你一次只能更改一个日期属性,所以你知道要赢得比赛,只需要剩下两步。。。等等


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

从我对你链接的日期游戏的理解来看,对一个玩家来说,似乎唯一可能的结果是赢或输,而不是介于两者之间(如果我错了,请纠正我)

在这种情况下,只需为获胜位置(当前玩家到达12月31日)分配值1,为失败位置(其他玩家到达12月31日)分配值-1即可

您的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

您正在描述Negamax算法。我对此唯一的批评是,如果不定义
increase\u month
increase\u day
,您的算法就没有多大意义。您可以将日期增加到当前日期和31之间的任何一天(取决于当前月份),也可以将月份增加到您想要的任何月份(取决于日期)。每次移动都有两个以上可能的下一个状态。@NickLarsen:是的,我不清楚如何允许我们从问题陈述中增加日期。我正在更新我的答案。谢谢