博弈论:完美信息的拓展性博弈-极小极大算法(Minimax)

围棋 :完美信息的拓展性博弈

Tic-Tac-Toe的树形描述

在这里插入图片描述
M a x 代 表 玩 家 自 己 , M i n 代 表 你 的 对 手 , 游 戏 简 单 但 是 仍 约 有 36 万 种 结 果 Max代表玩家自己,Min代表你的对手,游戏简单但是仍约有36万种结果 MaxMin,36

极小极大算法(Minimax)

深 度 优 先 搜 索 + 逆 向 归 纳 法 深度优先搜索+逆向归纳法 +
二叉树的先序遍历
图的深度优先遍历

在这里插入图片描述
算 法 , 做 深 度 优 先 搜 索 ( 树 的 先 序 遍 历 ) , 第 一 个 到 10 , 第 4 排 第 1 个 M I N 做 决 策 , 保 存 数 据 为 10 , ( 因 为 右 侧 没 有 搜 索 到 数 据 , 所 以 父 节 点 保 存 当 前 的 值 , 搜 索 到 之 后 在 比 较 更 新 ) 然 后 搜 索 到 11 , 第 4 排 第 1 个 M I N 做 决 策 , 保 存 数 据 为 10 , 第 3 排 第 1 个 M A X 做 决 策 , 保 存 数 据 为 10 , 然 后 右 子 树 开 始 搜 索 , M I N 保 存 左 右 叶 子 节 点 的 最 小 值 9 … … 依 次 搜 索 然 后 保 存 算法,做深度优先搜索(树的先序遍历),\\ 第一个到10,第4排第1个MIN做决策,保存数据为10,\\ (\color{red}因为右侧没有搜索到数据,所以父节点保存当前的值,搜索到之后在比较更新\color{black})\\ 然后搜索到11,第4排第1个MIN做决策,保存数据为10,\\ 第3排第1个MAX做决策,保存数据为10,\\ 然后右子树开始搜索,MIN保存左右叶子节点的最小值9……\\ 依次搜索然后保存 ()1041MIN10(,)11,41MIN1031MAX10MIN9
在这里插入图片描述

减枝(α-β剪枝(Alpha-Beta Pruning))

$$$$
在这里插入图片描述

a 记 录 最 大 值 , b 记 录 最 小 值 根 据 两 者 的 值 判 断 何 时 减 枝 : a ≥ b a , b 首 先 为 最 差 值 : a = − ∞ , b = + ∞ a记录最大值,b记录最小值\\ 根据两者的值判断何时减枝:a\geq b\\ a,b首先为最差值:a=-\infty ,b =+\infty \\ ababa,ba=,b=+
在这里插入图片描述
下 边 的 情 况 需 要 减 枝 , 有 一 点 、 像 “ 维 克 里 拍 卖 ” 下边的情况需要减枝,有一点、像“维克里拍卖”\\
在这里插入图片描述
在这里插入图片描述
圆 m i n 只 要 找 到 一 个 比 当 前 数 还 小 的 数 就 停 止 ( 剪 枝 ) , 方 块 m a x 只 要 找 到 比 当 前 大 的 数 就 停 止 ( 剪 枝 ) 圆min只要找到一个比当前数还小的数就停止(剪枝),方块max只要找到比当前大的数就停止(剪枝) min()max()

在这里插入图片描述

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
极大极小算法Minimax Algorithm)是一种博弈算法,常用于人工智能领域中的决策树问题。该算法通过递归地搜索博弈树,找到最优的下一步决策。在搜索过程中,假设对手会采取最优策略,因此算法会选择对自己最有利的决策,同时也会考虑到对手的最优策略,以避免自己处于劣势。 C语言实现极大极小算法的步骤如下: 1. 定义博弈树的节点结构体,包括当前状态、当前玩家、当前深度等信息。 2. 定义估值函数,用于评估当前状态的价值。 3. 定义maxSearch和minSearch函数,分别代表当前玩家为MAX和MIN的情况下的搜索过程。在搜索过程中,需要递归地搜索子节点,并计算出每个子节点的估值。 4. 在maxSearch和minSearch函数中,根据当前玩家的不同,选择最大或最小的估值,并返回该估值。 5. 在主函数中,调用maxSearch函数,得到最优的下一步决策。 下面是一个简单的C语言实现极大极小算法的示例代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_DEPTH 5 // 定义博弈树的节点结构体 typedef struct node { int state; int player; int depth; struct node *children[3]; } Node; // 估值函数 int evaluate(int state) { if (state == 1) { return 1; } else if (state == -1) { return -1; } else { return 0; } } // maxSearch函数 int maxSearch(Node *node) { if (node->depth == MAX_DEPTH) { return evaluate(node->state); } int maxVal = -100; for (int i = 0; i < 3; i++) { if (node->children[i] == NULL) { node->children[i] = (Node *)malloc(sizeof(Node)); node->children[i]->state = -node->player; node->children[i]->player = -node->player; node->children[i]->depth = node->depth + 1; } int val = minSearch(node->children[i]); if (val > maxVal) { maxVal = val; } } return maxVal; } // minSearch函数 int minSearch(Node *node) { if (node->depth == MAX_DEPTH) { return evaluate(node->state); } int minVal = 100; for (int i = 0; i < 3; i++) { if (node->children[i] == NULL) { node->children[i] = (Node *)malloc(sizeof(Node)); node->children[i]->state = -node->player; node->children[i]->player = -node->player; node->children[i]->depth = node->depth + 1; } int val = maxSearch(node->children[i]); if (val < minVal) { minVal = val; } } return minVal; } int main() { Node *root = (Node *)malloc(sizeof(Node)); root->state = 0; root->player = 1; root->depth = 0; for (int i = 0; i < 3; i++) { root->children[i] = NULL; } int bestVal = -100; int bestMove = -1; for (int i = 0; i < 3; i++) { root->children[i] = (Node *)malloc(sizeof(Node)); root->children[i]->state = -root->player; root->children[i]->player = -root->player; root->children[i]->depth = root->depth + 1; int val = minSearch(root->children[i]); if (val > bestVal) { bestVal = val; bestMove = i; } } printf("Best move: %d\n", bestMove); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值