摘要

运筹学无所不包括,无所不能!alpha-go所面对的问题根本上是属于博弈的,当然属于运筹学。博弈发展到凌驾于AI之上,那么有什么能凌驾于博弈呢,也许是运筹学里的看家技术——线性规划——呢。在作者之前博文中,已经介绍过了如何用+Leapms线性规划做排序,这里介绍如何用+Leapms线性规划做博弈,附代码。本博文及所有本作者博文里的文字、模型、代码、结果均为+Leapms原创!

一个简单的博弈问题

以一个简单的火柴问题为例:火柴问题出现在Wayne L. Winston著名的教科书Operations Research: Applications and Algorithms[1][2]中的静态动态规划一章。

首先需要理解博弈问题之所以出现在动态规划里的原因——绝大多数博弈问题其实很容易被转化为递归问题,而所有递归问题都可以用动态规划这样一种带有禁忌节算核心的枚举算法所求解。

所谓博弈问题是指论域之中有一个敌对的智能体,其目标与博弈主体的目标冲突,问题的目的是对博弈的主体(以及敌对智能体)给出最佳决策,以使得博弈主体(以及敌对智能体)能够获取各自的利益最大化。

回到火柴问题:在桌在上有 n 根火柴,“我”(博弈主体)和“对手”(敌对智能体)依次拿1-3根火柴,不许多拿也不许少拿,谁拿到最后一根谁输掉此次游戏。

这个火柴问题可以通过观察知道,如果桌面上有五根火柴,则无论我方如何拿几根火柴,对手都能在下一次使得我方输掉,而且任何4k+5 (k为大于等于0的整数)根火柴的情况都会使得当前将要拿火柴的人输掉。依据这个观察即可做出一个简单的递推程序。但这个不是本博文的目标,本博文的目的是把博弈的核心逻辑用模型的方法“描述性地”“描述”给计算机,让计算机自己推出结果。

博弈的逻辑其实是递归(当有递归原点时)。例如火柴问题可以这样被描述给计算机,当一方拿去1~3根火柴时,就等同于把 n-1 ~ n-3 的情形递归地推给了另一方。这个递归是有原点的,因为所需考虑的火柴数目是逐步减少的,且最终n=3,2,1的情形非常简单,可以直接给出结果。

对这样的问题,可以用(+Leapms)线性规划描述性地建模,并求解。

火柴问题的线型规划建模

设0-1变量 F[i], i=1,...,n 表示当桌面上有i根火柴时候的博弈获利。F[i]=1时表示获益为赢,F[i]=0时表示获益为输。用一般变量x[i]表示当桌面上有i根火柴时候的最优决策,x[i]的含义由其二进制表达来表示,当它的2进制第1位为1时表示可拿1根或查,第2位为1时表示可拿2根或查,第3位为1时表示可拿3根或火柴,当有多个二进制位为1时表示可选择一种情况拿火柴(例如1、2位都为1,表示拿1根或2根都会赢),当x[i]=0时表示此时无论拿1-3根中任意情况对方都有方法使我方输掉。

模型的目标是极大化所有F[i] ( 即:在博弈里叫做敌对智能体是理性智能体,是非常聪明的对手,它总能做出最优决策):

  max sum{i=1,...,n} F[i]

定义递归原点的约束,显然:

  F[1]=0
  F[2]=1
  F[3]=1

  x[1]=0
  x[2]=1
  x[3]=2

递归逻辑约束——当我方拿1-3根的三种情况都会导致敌手赢得游戏,则我方最优盈利为0。

  3-F[i-1]-F[i-2]-F[i-3] >= F[i] | i = 4,...,n //(1)

上面的约束逻辑是:如果我方拿1-3根的三种情况都使得敌方盈利为1,则左侧为零,于是右侧我方获利被约束为0。

下面的约束用来保证正确的决策,即如果我方拿k根火柴导致地方获利为0,则使x[i]的第k二进制位为1,否则为0。

  x[i]=(1-F[i-1])+2(1-F[i-2])+4(1-F[i-3])|i=4,...,n //(2)

完整+Leapms模型及其求解

完整+Leapms模型如下(替换数据区的n=20可获得更大n值得解,比如n=1000):

max sum{i=1,...,n}F[i]
subject to3-F[i-1]-F[i-2]-F[i-3]>=F[i] | i=4,...,n   //(1)x[i]=(1-F[i-1])+2(1-F[i-2])+4(1-F[i-3]) | i=4,...,n  //(2)F[1]=0F[2]=1F[3]=1x[1]=0x[2]=1x[3]=2where n is a numberF[i] is a variable of binary | i=1,...,nx[i] is a variable of number | i=1,...,ndatan=20

求解过程(使用load, mip两个命令):

+Leapms>loadCurrent directory is "ROOT"..........match.leaptictac.leap.........
please input the filename:match
================================================================
1:  max sum{i=1,...,n}F[i]
2:  subject to
3:
4:      3-F[i-1]-F[i-2]-F[i-3]>=F[i] | i=4,...,n
5:      x[i]=(1-F[i-1])+2(1-F[i-2])+4(1-F[i-3]) | i=4,...,n
6:
7:      F[1]=0
8:      F[2]=1
9:      F[3]=1
10:
11:     x[1]=0
12:     x[2]=1
13:     x[3]=2
14:
15:  where
16:     n is a number
17:     F[i] is a variable of binary | i=1,...,n
18:     x[i] is a variable of number | i=1,...,n
19:
20:  data
21:     n=20
22:
================================================================
>>end of the file.
Parsing model:
1D
2R
3V
4O
5C
6S
7End.
..................................
number of variables=40
number of constraints=40
..................................
+Leapms>mip
relexed_solution=15; number_of_nodes_branched=0; memindex=(2,2)
The Problem is solved to optimal as an MIP.
找到整数规划的最优解.非零变量值和最优目标值如下:.........F2* =1F3* =1F4* =1F6* =1F7* =1F8* =1F10* =1F11* =1F12* =1F14* =1F15* =1F16* =1F18* =1F19* =1F20* =1x2* =1x3* =2x4* =4x6* =1x7* =2x8* =4x10* =1x11* =2x12* =4x14* =1x15* =2x16* =4x18* =1x19* =2x20* =4.........Objective*=15.........
+Leapms>

上面的结果表示,当n=20时,我方一定会赢,最优决策是取2根火柴。

讨论

本文给出了火柴博弈问题的线型规划方法,不难看出这种递归建模思路可以被推广到很多棋牌博弈问题以及其他动态规划问题。但是受问题复杂程度不同,模型复杂度会不同。作者稍后考虑给出用+Leapms描述的其他动态规划问题的线性规划模型的例子。

+Leapms-Latex数学概念模型

在+Leapms环境下,使用 “latex"命令可以把上面的+Leapms模型直接转换为如下Latex格式的数学概念模型。

参考文献

[1] Wayne L. Winston. Operations Research: Applications and Algorithms. Duxbury press, boston, 1997
[2] Wayne L. Winston. 运筹学(数学规划 第3版 影印版). 北京:清华大学出版社,2004

 

转载于:https://www.cnblogs.com/leapms/p/10103767.html

博弈——五分钟知悉如何用线性规划做棋牌博弈相关推荐

  1. 老滚5初始化python失败_五分钟学会怎么用python做一个简单的贪吃蛇

    Pygame 是一组用来开发游戏软件的 Python 程序模块,基于 SDL 库的基础上开发.我们今天将利用它来制作一款大家基本都玩过的小游戏--贪吃蛇. 一.需要导入的包 import pygame ...

  2. 五分钟学会如何用java解析json字符串!

    在工作中我们常常使用json来存储和传输结构化的数据,如用户信息.配置信息等.它通常以string的方式进行传输,因此如何将string解析并得到我们想要的信息是一项必备且常用的功能. JSON(Ja ...

  3. 烧一根不均匀的绳要用一个小时,如何用它来判断一个小时十五分钟?

    烧一根不均匀的绳要用一个小时,如何用它来判断一个小时十五分钟? 答案是:需要3跟绳子.假设分别为1号.2号.3号绳子,每个绳子都有A.B端. 思路:首先点燃1号绳子的两端同时点燃2号绳子的A端,1号绳 ...

  4. 如何用PPT做九宫格图片?来了解一下吧

    今天给大家分享一个神奇的PPT小技巧,如何用PPT做九宫格图片?不会的小伙伴可以看一下,3分钟就能学会的小技巧哦! 第一步:在PPT中插入图片 点击"插入",选择一张图片即可. 第 ...

  5. 五分钟搞定5000字-外文文献翻译,…

    五分钟搞定5000字-外文文献翻译 工具大全 http://www.icoolen.com/node/2151 建议收藏 在科研过程中阅读翻译外文文献是一个非常重要的环节,许多领域高水平的文献都是外文 ...

  6. 2018校赛(记一次最后五分钟过题的人品爆发)

    第四是我,最后五分钟天命交了一手D题竟然过了. A 打卡签到! 描述 在去年的新生赛上,由于出题人没有控制好力度,导致现场众多新生进入挂机模式.大力出奇迹,长者很生气,在跟着长者学习了一个后,出题人决 ...

  7. 如何用PPT做九宫格,来了解一下吧!

    今天给大家分享一个神奇的PPT小技巧,如何用PPT做九宫格图片?不会的小伙伴可以看一下,3分钟就能学会的小技巧哦! 第一步:在PPT中插入图片 点击"插入",选择一张图片即可. 第 ...

  8. 五分钟搭建一个基于BERT的NER模型

    BERT 简介 BERT是2018年google 提出来的预训练的语言模型,并且它打破很多NLP领域的任务记录,其提出在nlp的领域具有重要意义.预训练的(pre-train)的语言模型通过无监督的学 ...

  9. 五分钟搭建BERT服务,实现1000+QPS​,这个Service-Streamer做到了

    作者 | 刘欣 简介:刘欣,Meteorix,毕业于华中科技大学,前网易游戏技术总监,现任香侬科技算法架构负责人.之前专注游戏引擎工具架构和自动化领域,2018年在GDC和GoogleIO开源Airt ...

最新文章

  1. 【Verilog HDL 训练】第 01 天
  2. 修改 ShiroUser 缓存用户
  3. Pytorch用tensorboarX查看损失图打不开
  4. Java集合容器面试题
  5. 《C++ Primer 5th》笔记(9 / 19):顺序容器
  6. java 自动化测试报告_Java自动化测试框架-10 - TestNG之测试结果篇
  7. 001.常见监控简介
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的医院住院管理系统
  9. 计算机编程思想 —— 缓存
  10. xmldocument的使用
  11. 那些年出现的遇到的 错误 VS (长期)
  12. Eclipse环境下配置Tomcat
  13. QTTabBar 安装记录(Win10 enable .NET)
  14. Hydra暴力破解smb协议(Windows用户名和密码)
  15. Perl读取文件信息
  16. 在线旅游中需要上传获取那些信息,对接旅行社护照录入系统
  17. PyQt5 第一章 PyQt5简介和安装
  18. ubuntu16.04+Titan Xp安装显卡驱动+Cuda9.0+cudnn
  19. rstudio安装后如何打开_请问Rstudio安装后无法运行怎么弄?
  20. 灵思科电子科技—室内定位技术有哪些_七大室内定位技术详解

热门文章

  1. 公司项目重构-Web安全-文件上传漏洞
  2. YDLidar开发-在win10下使用C++/python开发全过程-SDK配置
  3. 音视频开发:直播推流技术指南
  4. 图片转成pdf的免费软件
  5. 今日头条“偷偷复活”内涵段子,那快播是不是也能重生了?
  6. AutoCAD二次开发之删除图层及图层上所有的实体
  7. CAN总线电容过大的有效解决方法
  8. 【Win10】电脑麦克风录音:设备调测
  9. 护理和计算机哪个专业好,护理专业考研的就业前景和方向
  10. Python实现输出手写体图片