在工作中计算经济数值的时候,经常会遇到需要计算各种事件完成期望的工作(比如计算集齐一套特定的卡牌搭配需要抽多少次……)。本文就介绍一种比较快捷的计算方法。

一般来说,计算期望有以下几种方法:

依据期望的定义式,套用某些概型公式,数学推导计算期望。

这种方法需要解题灵感,有了灵感五分钟就解出来,没思路的话就要卡很久。工作中不是很推荐这种方法,因为工作需要稳定的产出。

用vba写程序模拟事件过程,跑很多次模拟期望次数。

这种稳定是达到了,但就是很麻烦,而且有的事件自己用vba写出来的难度几乎相当于重构了一遍项目对应模块的代码。

写出该事件的状态转移矩阵,再用VBA处理求出具体期望。

以下介绍这种方法。


什么是状态转移矩阵

就是一个矩阵,里面的元素都是非负的,且各行元素之和为1.

举个例子:
某个装备有+0,+1,+2三种状态。
+0强化至+1,成功率50%,失败后等级不变。
+1强化至+2,成功率40%,失败后等级下降至+0。
求由+0强化至+2的次数的期望值。则该事件的一步状态转移矩阵可以写为:

该事件的一步状态转移矩阵
第一列第一行的0.5代表,强化一次从状态+0变为状态+2的概率为0.5,
同理,第i列第j行的元素即代表强化一次从状态i变为状态j的概率。
一步状态概率矩阵我们可以依照给定的情况很方便的写出来。

什么是K步状态转移矩阵

k步状态转移矩阵即为一步状态转移矩阵的K次方

矩阵的乘法规则自己百度。举个例子:
该事件的则该事件的二步状态转移矩阵可以经计算得到:

该事件的二步状态转移矩阵
第i列第j行的元素即代表强化二次从状态i变为状态j的概率。
可以看到,强化二次从状态+0变为状态+2的概率为0.2同理我们可以获得强化K次从状态+0变为状态+2的概率。

由期望定义式可知:

Xk=K

Pk=[K步状态转移矩阵中的Pij]-[K-1步状态转移矩阵中的Pij]

然后累加即可。

之所以Pk=[K步状态转移矩阵中的Pij]-[K-1步状态转移矩阵中的Pij],是因为[K步状态转移矩阵中的Pij]包含了[K-1步状态转移矩阵中的Pij],减去后才是仅经过K次强化后强化至+2的次数。
(其实就是一个概率分布函数)
Pij的值最终会收敛于1

用VBA计算上述过程,代码如下(我写的程序比较糙,属于能跑起来的那种):

Sub Matrix()
Dim i, j, k, a(1 To 10000, 1 To 10, 1 To 10), b(1 To 10000, 1 To 10, 1 To 10), p(1 To 1000), e(1 To 1000)For i = 1 To 3              '一步转移矩阵写入For j = 1 To 3a(1, i, j) = Cells(i + 3, j + 2)Next j
Next ip(1) = 0For k = 2 To 1000            'K步转移矩阵计算For i = 1 To 3For j = 1 To 3a(k, i, j) = a(1, i, 1) * a(k - 1, 1, j) + a(1, i, 2) * a(k - 1, 2, j) + a(1, i, 3) * a(k - 1, 3, j)Next jNext ip(k) = a(k, 1, 3)            'Pk=[K步状态转移矩阵中的Pij]
Next ke(1) = 0For k = 2 To 1000e(k) = e(k - 1) + k * (p(k) - p(k - 1))     '累加求和求得最终期望值
Next kMsgBox e(1000)End Sub

输出结果为:

即E(x)=7.5

我们用另一种方法验算一下。

设装备从等级k-1强化到等级k的期望是E(k),每次强化成功概率是p1,不变概率是p2,掉级概率是p3。
现在分析从k-1级强化到k级的过程的几种情况
情况一:一次成功,由于成功的概率是p1,强化到k级花费的次数是1,这种情况下需要次数的期望是1 * p1 = p1。
情况二:不变,等级不变又回到从k-1级强化到k级的过程,不变概率是p2,强化到k级花费的次数是1 + E(k)(1代表强化等级不变消耗的次数,E(k)是从k-1级到k级的期望),这种情况下需要次数的期望是(1 + E(k)) * p2。
情况三:掉1级,掉1级变成需要从k-2级强化到k-1级,再从k-1级强化到k级,掉级概率是p3,强化到k级花费的次数是1 + E(k - 1) + E(k)(1代表强化掉级,E(k - 1)是从k-2级到k-1级的期望,E(k)是从k-1级到k级的期望),这种情况下需要次数的期望是(1 + E(k - 1) + E(k)) * p3。
综合上述三种情况,
装备从等级k-1强化到等级k的期望E(k) = p1 + (1 + E(k)) * p2 + (1 + E(k - 1) + E(k)) * p3。
再加上初始条件E(0) = 0,就可以求出E(1)、E(2)....E(n),把E(1)、E(2)....E(n)加起来就是从0级到n级的期望了。

求得E(1)=2,E(2)=5.5

则E(x)=7.5

一致。


因为游戏中的过程状态都是离散的,所以这个方法基本可以处理所有的求期望相关的问题,只需要把一步状态转移矩阵写出来就行。

于是我们就可以处理各种骚问题了,比如打boss会有50%随机掉ABC中的任意一个装备,已知在已持有A的时候B的掉率会下降5%,但持有B的时候C的掉率上升5%,balabalabalabala,问集齐一套ABC期望打多少次boss。
这种问题用概型解或者用写程序跑都是及其痛苦的。但是我们可以快速的列出一步状态转移矩阵,用vba快速解出答案:
这种情况下,会有以下状态:都没、只有A、只有B、只有C、只有AB、只有AC、只有BC、都有,其一步状态转移矩阵是一个7*7的矩阵,你们可以试着写一下,然后用本文的算法算一下,很快就能求出从状态【都没】到状态【都有】的次数期望。


我发现了一种更简单的办法

mathematica中有内置的离散马科夫过程函数,可以进行快捷的计算:

第一步:列出一步状态转移矩阵

第二步:在Mathematica中读取一步状态转移矩阵

xlsxPath= "C:UsersAdministratorDesktop一步状态转移矩阵.xlsx";m =Import[xlsxPath, "Data"][[1]][[2 ;; 4, 2 ;; 4]]

第二行从指定excel读取数据,2;;4表示2~4行,2;;4表示2~4列(这是直接读取xlsx文件的写法,若使用mathematica link for excel加载宏,可以使用Excel[“A1:C1”]这种更好理解的语法)

第三步:定义一个马尔科夫过程:

markovProcess = DiscreteMarkovProcess[1,m];

· DiscreteMarkovProcess(Mathematica内置的离散马科夫过程函数),接收2个参数:初始状态和状态转移矩阵

· 赋值这个离散马科夫过程到变量markovProcess

Mean[FirstPassageTimeDistribution[markovProcess,10]]

Mean用于计算分布的期望值

markovProcess = DiscreteMarkovProcess[1,m];
Mean[FirstPassageTimeDistribution[markovProcess,3]]

输出结果为7.5

e的矩阵次方_利用状态转移矩阵和VBA求游戏中各种事件达成次数的期望相关推荐

  1. python连连看小游戏_利用Python制作一个连连看小游戏,边学边玩!

    导语 今天我们将制作一个连连看小游戏,让我们愉快地开始吧~ 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块 环境搭建 安装Python并添加到环 ...

  2. python制作阴阳师脚本_利用python制作一个阴阳师小游戏

    利用python制作一个阴阳师小游戏 发布时间:2020-11-27 13:59:49 来源:亿速云 阅读:84 这期内容当中小编将会给大家带来有关利用python制作一个阴阳师小游戏,文章内容丰富且 ...

  3. python在人工智能应用锁_干货 | Python人工智能在贪吃蛇游戏中的应用探索(上)...

    文案&代码 白宇啸 排版&审校 邓发珩 前言 一个月前,人工智能对我来说都是很陌生的,更不用说神经网络.强化学习.DQN等名词了.疫情期间,经过在家努力学习,我对这些概念越来越清晰了, ...

  4. matlab如何截取图像的中间部分_利用matlab提取并分割RGB图像中的某一个已知像素值的图像...

    已知一副RGB图像中的的像素值,利用matlab将其分割出来并以二进制图像形式显示: %extract.m clear all; I=imread('new_original.png'); figur ...

  5. 编程求x的n次方_用C语言程序设计:求x的n次方的函数。

    展开全部 double pow(double x, double y); pow()用来计算以x 为底的62616964757a686964616fe58685e5aeb931333365643631 ...

  6. python和excel数据分析_利用Python处理和分析Excel表中数据实战

    作为一个学习用Python进行数据分析的新手来说,通过本文来记录分享一些我在用Python中的pandas.numpy来分析Excel表中数据的数据清洗和整理的工作,目的是熟悉numpy以及panda ...

  7. fdtd中时间监视器怎么放_利用FDTD的参数扫描分析薄膜中WO3层厚度

    本文通过FDTD的参数扫描功能分析了薄膜中WO3层厚度对反射率影响,结果曲线如下图所示. 建模及数据分析过程主要如下: 1.导入材料 点击Materials 点击Add,选择Sampled 3D da ...

  8. python编程游戏手机版_利用Python开发手机同款游戏:开心消消乐

    手机上面的开心消消乐,我想大部分人都是玩过的吧,今天小编就教大家如何用python开发这款游戏 不过只有十个关卡,不像手机里面那么多的关卡!不过游戏的画面和bgm都是同款的哦~ 效果图 基本配置 wi ...

  9. python写出雷霆战机_利用Python自制雷霆战机小游戏,娱乐编程,快乐学习!

    开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 先睹为快 在cmd ...

最新文章

  1. 深度学习中的注意力机制(一)
  2. DataGrid中页导航栏的自定义样式
  3. 相当于零负担的延时程序(转)
  4. tensolrflow之基础变量
  5. 深入理解javascript原型和闭包(10)——this
  6. Factorial Trailing Zeroes 172
  7. python保存变量_将python 中的变量保存到本地
  8. 安卓逆向_15( 二 ) --- Android Studio 3.6.3 JNI 环境配置 和 so 生成开发 demo
  9. 作者:李姣(1981-),女,博士,中国医学科学院医学信息研究所副研究员、硕士生导师。...
  10. Magento Helper简介
  11. 借助Intent实现Android工程中Activity之间Java对象的传递——实现Parcelable接口
  12. GetComponentInParent 和 GetComponentsInParent的区别
  13. stm32-DCMI—OV2640摄像头
  14. 爬虫 微博评论记录_记录或评论?
  15. 常见问题之Golang——verifying github.com/go-playground/assert/v2@v2.0.1/go.mod: checksum mismatch错误...
  16. acm会议什么档次_国际顶级会议期刊级别介绍
  17. 如何撰写一份好的市场调查报告
  18. 【Shell案例】【for循环、seq生成】3、输出7的倍数
  19. 微信小程序自定义组件使用canvas绘图,无法绘制以及fail canvas is empty问题
  20. python高端实现各国GDP动态轮换图

热门文章

  1. 乱码385b1b926a38153d38957556c0dc55b5
  2. JavaSE: SuppressWarnings[转]
  3. 软件工程学习进度表06
  4. C# 简单日志文本输出
  5. 在 ML2 中配置 Vlan Network- 每天5分钟玩转 OpenStack(93)
  6. Java String源码解析
  7. iOS:实现邮件和短信发送的简单示例
  8. 企业邮件系统搭建-关于不能往yahoo,sina,hotmail地址发邮件的问题一
  9. 海量数据面试题----分而治之/hash映射 + hash统计 + 堆/快速/归并排序
  10. jenkins ssh 部署 Can't connect to server 错误