首页 > 编程知识 正文

alpha顺序,alpha可以标记beta吗

时间:2023-05-03 12:29:52 阅读:170054 作者:1338

span style='font-size:18px;' 最近在玩中国象棋的对战程序,用了阿尔法-贝塔算法。 我在网上搜索了很多,但是没能通关智商的要素。 今天,我的人机游戏终于完成了。 写下我对阿尔法-贝塔算法的理解。 如果大神们有什么不同的意见的话,请指出来,帮助修改,加深对算法的理解,gydxwz先表示感谢。 /span

首先投稿下图。 详细分析阿尔法-贝塔的剪枝过程。

图中标有和字的是电脑,标有汉字的是玩家。 递归深度为4。

首先,玩家选择某一步棋,生成棋局即图中的起点。

该方法对应电脑的44种应对方式。 即,图中第2行的http://www.Sina.com/~ http://www.Sina.com /。 ) 44是有代表性的数字,根据局面的不同,合理的走法数量也不同。

计算机选择了和A着法的情况下,与该着法对应地存在44种玩家可以选择的着法。 也就是说,是图的第三行。

如果计算机选择方法和Z供玩家选择,则在对应的计算机上存在44种可选走法。 此时可以选择的走法有图中第4行左侧的和a、和b、和z等未完全列举的走法。

对每种走法进行评估后,会得到椭圆中粉红色的结果。 评价函数如下。

public int Evaluate () { return UserOrder? yamato evaluate-Han evaluate : Han evaluate-yamato evaluate; }此函数的UserOrder表示该用户是否有子代,在评价过程中,如果该用户有子代,则评价函数的返回值为敌方棋子价值合计减去己方棋子价值合计后的值。

publicintalphaBeta(intdepth,int alpha,int beta ) { int value; if(depth==0) { return Evaluate; } point [ ] legal steps=generate moves (; for(intI=0; i legalSteps.Length; I )标记移动(legal steps [ I ],depth ) (value=-alphaBeta ) depth,-beta,-alpha ); 还原移动(legal steps [ I ],depth ); if (值=beta ) { return value; (if ) valuealpha )阿尔法=value; if(maxdepth==depth ) ) { MaxMove=legalSteps[i]; } } } } return alpha; }

递归调用alpha beta (depth,alpha,beta )时,结果为负值,评价函数的返回值为对战对手棋子的价值减去己方棋子的价值后的值,因此在我方占优势的情况下,评价函数的返回值为负值在最初的调用中,阿尔法、贝塔分别取负无限大和正无限大。 因此,上图对汉A子节点的分析可以得出(和)能走的最佳走法(即汉族选择汉A落子方式后,和族可以选择的最佳走法得分)。 然后对汉a的调用返回最大值8。 此时,将函数的主导权交给第二行和a的分析。 此时,与a得到返回值-8,然后分析与a的合理走法汉b。 将HA中得到的值-8传递给HB Alpha beta函数的调用。 这时,汉b的子节点的beta值为8 .汉b的子节点的评价值与8进行比较。 如果某步行法为q和得到的返回值为9,则停止比较,返回此时的评价值。 因为对于每次都想找到最佳走法的(和),(汉)会比较所有的返回值,选择最小值。 不要给对方最大的利益。

上面的分析可能很别扭。 简单来说就是甲乙两人对战。 轮到甲掉了。 甲方分析棋盘找出所有落子都能做到的合理方法,分析每个落子乙对应走法的最大利益。 而且为了不让乙方获得最大的利益。 甲方根据自己的落子选择乙方比较所得利益的高低。 是为了不让自己受到太大的损失。 当然是选择让乙方利益最小的走法。

虽然alpha beta函数中参数的含义很容易理解,但alpha是在搜索中能找到的最大利益的方法。 贝塔系数是对战对手可以接受的最大损失(也就是说,对于对手的每一步,这一手的最大增益值中的最小值),关于depth无疑是搜索深度。 depth越大电脑越聪明。

就这些了。 以后有时间的话,我会写一下历史表等提高算法处理速度的方法。 希望能更多地提到大家呢

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。