根据bilibili上一个up主的视频写的代码
以此文记录备忘

先定义Node类,用于构造需要剪枝的二叉树

class Node:""":param value 该节点的值,默认为0:param is_max 该节点是否在Max层child 是该节点的子节点,是一个Node类的数组"""def __init__(self, value=0, is_max=True):self.value = valueself.is_max = is_maxself.child = Nonedef setChildWithValue(self, childs):temp = []is_Max = not self.is_maxfor c in childs:temp.append(Node(value=c, is_max=is_Max))self.child = tempdef setChildWithNode(self, childs):if None is self.child:self.child = childsreturnfor c in childs:self.child.append(c)

定义一个初始函数用于构造待剪枝的树(也就是把up主的那张图复现出来),可以换几组数据多试试,如果有问题请告知(最好带上数据),毕竟是个人的练习:

def init():node1 = Node(is_max=False)node1.setChildWithValue([60, 63])node2 = Node(is_max=False)node2.setChildWithValue([15, 58])node3 = Node(is_max=True)node3.setChildWithNode([node1, node2])node1 = Node(is_max=False)node1.setChildWithValue([81, 74])node2 = Node(is_max=False)node2.setChildWithValue([88, 15, 27])node4 = Node(is_max=True)node4.setChildWithNode([node1, node2])node5 = Node(is_max=False)node5.setChildWithNode([node3, node4])node1 = Node(is_max=False)node1.setChildWithValue([20, 92])node2 = Node(is_max=False)node2.setChildWithValue([9, 62])node3 = Node(is_max=True)node3.setChildWithNode([node1, node2])node1 = Node(is_max=False)node1.setChildWithValue([82, 92])node2 = Node(is_max=False)node2.setChildWithValue([54, 17])node4 = Node(is_max=True)node4.setChildWithNode([node1, node2])node6 = Node(is_max=False)node6.setChildWithNode([node3, node4])head = Node(is_max=True)head.setChildWithNode([node5, node6])return head

Minmax :

def mini_max(node):if node.child is None:return node.valueif not node.is_max:best_value = float('inf')for c in node.child:best_value = min(best_value, mini_max(c))else:best_value = -float('inf')for c in node.child:best_value = max(best_value, mini_max(c))return best_value

Minmax的简化版本negativeMax:

def negative_max(node):if node.child is None:return -node.valuebest_value = -float('inf')for c in node.child:best_value = -max(best_value, negative_max(c))return best_value

α−β\alpha-\betaα−β剪枝

def alpha_beta(node, alpha, beta):# alpha表示己方,要提高到最大利益,beta表示敌方,要降到最小利益# alpha大于beta的时候就可以开始剪枝了,因为己方收益已经可以保证大于敌方收益了# min层修改beta(最小化敌方收益),max层修改alpha(最大化己方收益)if node.child is None:return node.valueif not node.is_max:# 该层为min层,要最小化敌方收益,所以best_value取越小越好(初始一个无穷大)best_value = float('inf')for c in node.child:value = alpha_beta(c, alpha, beta)best_value = min(best_value, value)beta = min(beta, best_value)if alpha >= beta:breakelse:# 该层为max层,要最大化己方收益,所以best_value取越大越好(初始一个无穷小)best_value = -float('inf')for c in node.child:value = alpha_beta(c, alpha, beta)best_value = max(best_value, value)alpha = max(alpha, best_value)if alpha >= beta:breakreturn best_value

测试:

if __name__ == '__main__':head = init()# print(mini_max(head))# print(-negative_max(head))print(alpha_beta(head, -float('inf'), float('inf')))

min_max算法和alpha-beta剪枝 python实现相关推荐

  1. 基于python的AI五子棋实现(极大极小值搜索和alpha beta剪枝)

    1.极大极小值搜索介绍 人机博弈是人工智能的重要分支,人们在这一领域探索的过程中产生了大量的研究成果,而极小化极大算法(minimax)是其中最基础的算法,它由Shannon在1950年正式提出. M ...

  2. 五子棋AI算法第三篇-Alpha Beta剪枝

    剪枝是必须的 五子棋AI教程第二版发布啦,地址:https://github.com/lihongxun945/myblog/labels/%E4%BA%94%E5%AD%90%E6%A3%8BAI% ...

  3. alpha-beta剪枝五子棋c语言,五子棋AI算法第三篇-Alpha Beta剪枝

    剪枝是必须的 上一篇讲了极大极小值搜索,其实单纯的极大极小值搜索算法并没有实际意义. 可以做一个简单的计算,平均一步考虑 50 种可能性的话,思考到第四层,那么搜索的节点数就是 50^4 = 6250 ...

  4. 五子棋AI算法-Alpha Beta剪枝

    上一篇讲了极大极小值搜索,其实单纯的极大极小值搜索算法并没有实际意义. 可以做一个简单的计算,平均一步考虑 50 种可能性的话,思考到第四层,那么搜索的节点数就是 50^4 = 6250000,在我的 ...

  5. alpha,beta剪枝详解

    α,β剪枝详解\alpha,\beta剪枝详解α,β剪枝详解 示例图 步骤详解 基础原理 这里我们先要理解什么是α,β\alpha,\betaα,β剪枝:α\alphaα是下界,β\betaβ是上界. ...

  6. python alpha beta 剪枝_一看就懂的 Alpha-Beta 剪枝算法详解

    Alpha-Beta剪枝用于裁剪搜索树中没有意义的不需要搜索的树枝,以提高运算速度. 假设α为下界,β为上界,对于α ≤ N ≤ β: 若 α ≤ β  则N有解. 若 α > β 则N无解. ...

  7. alpha beta 剪枝算法

    摘自wikipedia alpha-β修剪的好处在于可以消除搜索树的分支.这样,搜索时间可以限制在"更有希望"的子​​树中,并且可以在同一时间执行更深入的搜索.该算法和极小化极大算 ...

  8. 最清晰易懂的MinMax算法和Alpha-Beta剪枝详解

    最清晰易懂的MinMax算法和Alpha-Beta剪枝详解 参考文章 http://web.cs.ucla.edu/~rosen/161/notes/alphabeta.html https://ww ...

  9. 极大极小算法和AlphaBeta剪枝算法

    作为菜鸟,先贴上参考博文: 1.极小极大算法 2.<<CS 161 Recitation Notes - The Minimax Algorithm>> 3.<PC游戏编 ...

最新文章

  1. 一文看懂5G和AI融合的5个要点
  2. 软件测试面试之登录界面
  3. 电脑模拟器哪个好_《英雄聯盟:激鬥峽谷》电脑版哪个安卓模拟器好用?《英雄聯盟:激鬥峽谷》手游电脑版怎么玩...
  4. CVPR 2019 | 旷视研究院提出新型损失函数:改善边界框模糊问题
  5. Unity GeometryShader(从一个线框渲染的例子开始)
  6. LTDC/DMA2D—液晶显示
  7. XcodeGhost作者声明:源于实验,无任何威胁
  8. ANSYS——网格划分的不同方法以及GUI模块的操作(自由网格、映射网格、扫掠、拖拉)
  9. 2013年 macbookair bootcamp 安装win10双系统
  10. 快速免费对接快递鸟圆通快递单号查询api接口
  11. 毕业设计 - 题目:基于深度学习的图像风格迁移 - [ 卷积神经网络 机器视觉 ]
  12. MySQL从删库到跑路(9):group by——给漂亮小姐姐分个组
  13. 说出来也许你不信,我被 Linux 终端嘲笑了…….
  14. 慕课网跟练系列——侧边栏导航跟随案例
  15. 使用Eclipse安装CloudSim
  16. 马斯克放大招!直逼高铁时速的240km h汽车隧道挖成了!
  17. android xitong工具,Android系统工具盘点
  18. BIOS实战之PCI设备枚举二
  19. java web pdf 打印预览_java原装代码完成pdf在线预览和pdf打印及下载
  20. 收藏一首好诗 《论孩子》纪伯伦(黎巴嫩) 冰心译

热门文章

  1. Java框架jboot_Jboot v3.0.3 正式版发布,基于 JFinal 的微服务框架
  2. 一些有趣的Shodan搜索
  3. 嵌入式软件工程师自学之路
  4. 月入万元或不需缴税!九张图带你看懂个税新规
  5. 2019年第十届蓝桥杯真题解析 | 特殊数【Python】
  6. 基于MATLAB的隐函数与三维画图(附图与代码)
  7. 1118:铺地毯(C C++)
  8. 年末最新整理:阿里、腾讯、字节、华为、百度等大厂Android岗面经分享!
  9. 影创科技助力云南首例MR混合现实肝脏手术成功实施
  10. 两台计算机的ip地址怎么配置,同一台电脑如何设置两个IP地址?电脑配置双ip地址图文教程...