博客参考:https://blog.csdn.net/tangchenyi/article/details/22920031

极小极大算法常用于二人博弈游戏,目的是寻找最优的方案使得自己能够利益最大化。基本思想就是假设自己(A)足够聪明,总是能选择最有利于自己的方案,而对手(B)同样足够聪明,总会选择最不利A的方案。

下面举个例子进行说明:
设:正方形代表自己(A),圆代表对手(B),节点的每个孩子节点代表一个候选方案。

图(a):显示了所有候选方案。让我们如下分析:(注意:图中的所有数字都是A的利益值,越大越有利于A)
图(b):假设A选择第一个方案,B有两个候选方案,B为了使得A利益最小化,所有在7和3中选择了3,所以A只能获得3。
图(c):假设A选择第二个方案,B只有一个选择,A最终可以获得15。
图(d):假设A选择第三个方案,B有4个可选方案,为了使得A利益最小,B选择第一个方案,则A只能获得利益1。
A为了使得自己利益最大,所以A会选择第二个方案,即获得利益15。
从上图可以看出,B总是选择候选方案中的最小值,而A总是选择候选方案中的最大值,极小极大的名字也就源于此。

该算法使用深度优先搜索(Depth First Search)遍历决策树来填充树中间节点的利益值,叶子节点的利益值通常是通过一个利益评估函数算得。

下面给出一个具体的井字棋的例子:

#include <iostream>
#include <vector>
using namespace std;char board[3][3];void init() {for (int i = 0; i < 3; i++)for (int j = 0; j < 3; j++)board[i][j] = '_';
}void draw_board() {for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++)cout << board[i][j] << " ";cout << endl;}cout << endl;
}int game_result(){for (int i = 0; i < 3; i++){int r =  board[i][0] +  board[i][1] + board[i][2];int c =  board[0][i] +  board[1][i] + board[2][i];if (r == 3 * 'X' || c == 3 * 'X') return 0; if (r == 3 * 'O' || c == 3 * 'O') return 1;}int d1 = board[0][0] + board[1][1] + board[2][2];int d2 = board[0][2] + board[1][1] + board[2][0];if (d1 == 3 * 'X' || d2 == 3 * 'X') return 0;if (d1 == 3 * 'O' || d2 == 3 * 'O') return 1;return -1;
}//评估函数:电脑赢:空格数+1, 玩家赢:-空格数-1,平局:0
int eval() {int res = 0;for (int i = 0;i < 3;i++)for (int j = 0;j < 3;j++)if (board[i][j] == '_') res++;int flag = game_result();if (flag == 1)  return res + 1;if (flag == 0)  return -(res + 1);return 0;
}//从当前状态开始DFS搜索最优的落子位置:电脑最大化收益,人最小化收益。
int MinMaxSearch(int& pos, int step) {      //step:记录层数,奇数层为电脑操作,偶数层为玩家操作  int val = step & 1 ? -100 : 100;        //奇数层取极大值,偶数层取极小值if (game_result() >= 0) return eval();  //游戏结束,评估分数vector<int> ava_pos;    //记录还有那些位置可以下棋for (int i = 0; i < 3; i++)for (int j = 0; j < 3; j++)if (board[i][j] == '_') ava_pos.push_back(i * 3 + j);if (ava_pos.size() == 0) return eval(); for (int i = 0; i < ava_pos.size(); i++) {int x = ava_pos[i];int t = x;board[x / 3][x % 3] = (step & 1) ? 'O' : 'X';int son_val = MinMaxSearch(x, step + 1);board[t / 3][t % 3] = '_';if (step & 1) {if (val < son_val) {val = son_val;if (step == 1) pos = ava_pos[i];  //初始状态下的最优孩子节点(落子位置)。}}else  val = min(val, son_val);}return val;
}int main() {init();for (int i = 1; i <= 9; i++) {//电脑下棋=============================================================cout << endl << "computer move:" << endl;int computer_pos; MinMaxSearch(computer_pos, 1);board[computer_pos / 3][computer_pos % 3] = 'O';draw_board();//玩家下棋=============================================================printf("Select a position(1~9):");int x; cin >> x; x -= 1;while (1) {if (x > 0 && x < 10 && board[x / 3][x % 3] == '_') break;printf("The position is not available!please reselect.\n");cin >> x;  x -= 1;}board[x / 3][x % 3] = 'X';draw_board();//判断游戏是否已经结束=================================================int Winer = game_result();if (Winer >= 0){Winer ? printf("You lose!\n") : printf("You win!\n");return 0;}}printf("平局\n");return 0;
}

博弈论中的MinMax搜索算法相关推荐

  1. 【转】博弈论中的几个经典问题

    转载自百度百科以及:http://3y.uu456.com/bp_47nz909yik4ddq343gzw_1.html 几个博弈论中的经典问题 博弈论(Game Theory),亦名"对策 ...

  2. 关于博弈论中的共同知识的一点理解

    我是看完一本<博弈论知识精粹>中的一张后忽然有点感悟.其实最初吸引我的就是那个以前已为很多人熟知的案例. 就是著名的"脏脸问题",也叫"红白帽子"问 ...

  3. 博弈论中的Stackelberg模型和库恩塔克条件如何通过Matlab求解或者数值分析?

    博弈论中的Stackelberg模型和库恩塔克条件如何通过Matlab求解或者数值分析? 下面是两个供应链成员的利润函数,其中p_c和p_b为决策变量,其余参数均在[0,1]之间.此外,b为领导者,c ...

  4. 人工智能中的局部搜索算法

      在局部搜索算法中,我们不再关心从初始节点到目标节点之间的路径,而是考虑从当前节点出发,移动到它的邻近状态,直到到达合理的目标状态.相比于前面所说的无信息搜索算法和有信息搜索算法,局部搜索算法往往能 ...

  5. java实现递归算法_如何在Java中实现二进制搜索算法而无需递归

    java实现递归算法 by javinpaul 由javinpaul 流行的二进制搜索算法的迭代实现,用于在排序数组中查找元素. (An Iterative implementation of the ...

  6. java中字符串的算法_Java中的字符串搜索算法

    我正在使用大量数据进行字符串匹配. 编辑:我正在匹配一个大列表中的单词与一些本体文本文件.我从本体中获取每个文件,并搜索每个文件行的第三个字符串与列表中的任何单词之间的匹配. 我在监督这样一个事实上犯 ...

  7. python网格搜索法_Python中基于网格搜索算法优化的深度学习模型分析糖尿病数据...

    介绍 在本教程中,我们将讨论一种非常强大的优化(或自动化)算法,即网格搜索算法.它最常用于机器学习模型中的超参数调整.我们将学习如何使用Python来实现它,以及如何将其应用到实际应用程序中,以了解它 ...

  8. css grid布局中的minmax()函数的使用

    minmax函数是作用在项目上的属性,单独将这个属性拿出来记录是因为你minmax的作用非常多,需要一条条分析. minmax的作用是限制项目的大小在某个范围之间,minmax函数的第一个参数就是最小 ...

  9. 拍立淘-以图搜图中的图像搜索算法

    摘要:移动端的以图搜图是一代又一代的图像人,搜索人的梦想.从90年代开始,学术界,工业界做了很多的努力和尝 试.拍立淘-以图搜图,从14年正式立项开始,通过算法/工程/产品的不断打磨,以及兄弟部门的紧 ...

最新文章

  1. R语言 文本挖掘 tm包 使用
  2. pandas.DataFrame.iterrows
  3. LeetCode 655. 输出二叉树(二叉树高度二叉树遍历)
  4. python第七章文件和数据格式化选择题_python第七章-文件和数据格式化
  5. 小鹏汽车北京车展发布免费加电、电池租赁计划以及低空飞行汽车
  6. 数百种编程语言,而我为什么要学 Python?
  7. python 继承与多态
  8. ORACLE 字符串操作
  9. MyEclipse 使用文档
  10. Maxwell简单使用
  11. awb数据怎么计算_AWB 介绍 原理 和算法
  12. win10中Elan触摸板启用“双指点击打开右键菜单“与“双指滚动“方法总结
  13. 鲤鱼溪传说:神鱼与三仙姑
  14. 系统定时任务与延时任务
  15. IT技术相关学习网站推荐
  16. arcgis多个图共用一个图例_ArcGIS制图技巧,一个小技巧使图例与之匹配!
  17. 万里长征之测试第一步
  18. 怎么样才能让自己自律起来_怎样让懒惰的人自律起来?
  19. 和12岁小同志搞创客开发:如何驱动红外遥控器?
  20. 基于S3C2440的Linux-3.6.6移植——声卡驱动

热门文章

  1. java毕业生设计中小型饭馆餐饮管理系统计算机源码+系统+mysql+调试部署+lw
  2. TCP/IP网络编程之多进程服务端(二)
  3. 操作系统、体系结构和传奇船长的泰坦级超级旗舰
  4. 全国计算机等级考试怎么分级,【海贝推荐】全国计算机等级考试分级介绍
  5. CI持续集成与软件测试
  6. 2022谷粒商城学习笔记(二十二)rabbitMQ学习
  7. NodeJs ES6 写简单爬虫 爬小说网站《我当方士那些年》
  8. EKL日志分析平台-kibana数据可视化
  9. python飞机大战程序导入_Python飞机大战项目的准备 导入Pygame最全攻略~
  10. java如何快速标记条_【JAVA】如何利用TODO任务标签高效管理代办代码