Excel计算马尔科夫的简单方法

发表于2018-08-27
评论15 1.8w浏览

呐,好久不见有没有想我啊!

举手手:没有!而且你说好的要写的系统理论的万字长文还欠着呢!

这次呢,之所以想到写马尔科夫,是因为水群又看见了一些好玩的题目。群里面个个都是大佬 说话又好听 超喜欢里面的

而且借助工具之前喜欢的数列方法就显出差距来,并且也打算真正分享一些有用的东西。长话短说,先看题目。

不要被题目各种奇怪的矩阵和看着高大上的术语吓到,我们一步一步来分析这个看似高大上实则只要3步就能轻轻松松解决的装X知识点

 

首先,我们还是得先看下马尔科夫链的介绍:马尔可夫链,因安德烈·马尔可夫(A.A.Markov,1856-1922)得名,是指数学中具有马尔可夫性质的离散事件随机过程。该过程中,在给定当前知识或信息的情况下,过去(即当前以前的历史状态)对于预测将来(即当前以后的未来状态)是无关的。(一字不差复制粘贴百度百科第一段)

 

这个介绍一共分2个部分:

1. 因为是马尔可夫研究出来的,所以就叫马尔科夫链了(看见没,大佬们就喜欢这些噱头,以后我也……扯远了扯远了)

2. 指数学中具有马尔可夫性质的离散事件随机过程。这句话有3个关键词:马尔科夫性质,离散事件,随机过程。

离散事件,随机过程就不用水字数解释了。那么什么是马尔可夫性质呢?拿强化来说,一把7级的武器强化的各种概率和之前的强化过程无关,即不管你上一次强化是成功失败都不影响这一次的概率。

真是浅显易懂!

 

所以,我们在使用马尔科夫方法计算的时候一定要注意类似保底之类的机制。

但是在有保底之类的机制时我们仍然可以使用这种方法,因为有保底时我们仍可以得到确切的概率转移矩阵,与马尔可夫性质是不冲突的。

 

接下来,让我们看看X格满满的马尔可夫究竟如何算出期望

 

第一步:一步概率状态矩阵

也就是题目说的初始状态。

好的,列完了,我们将这个矩阵先称为矩阵A,进入下一步。

 

不过考虑到文章字数也是评判作者水平的参数之一,我决定解释一下。

好的,解释完了,我们进入第二步。

 

第二步:N步概率状态矩阵

首先,我们已经知道了矩阵A就是强化一次后的结果。

 

举手手:华策华策,可是我们并没有经过强化的计算啊!

 

Naïve!我们不要被题目所迷惑,因为我们的初始状态其实是这样的:

将真·初始状态的单位矩阵记为E, 而我们的所谓的初始状态:

 

初始状态=真·初始状态×一步概率状态矩阵

 

A1 = E×A = A

 

已经经过一次计算了。

 

真是浅显易懂!

 

那么我们强化2次的概率怎么计算呢?

 

A2 = E×A×A = A2

 

真是简单直接!内部的逻辑虽然精妙但理解起来并不复杂,得到的A2对应的每一个元素都对应着一个初始状态达到目标状态的概率。并且其结果正是我们利用数列计算所得的结果!

 

所以,依此类推,第n次的概率状态矩阵即为:

 

An = An

 

这就是数学的魅力啊!我们顺利进入第三步!

 

第三步:期望

这时候请允许我搬出期望计算公式:

离散型:

 

连续型:

 

举手手:华策华策,这两种期望怎么选择呢?

 

问得好,还记得马尔科夫的三个关键词吗?是的,马尔可夫预测的是离散事件。

所以我们选取离散型的期望计算公式,其中Xk即为强化的次数,Pk即为强化次数对应的概率。而且在我们游戏设计中的期望计算也大多是离散型的,而且掌握了马尔科夫后离散型的期望计算也不用借助公式采取连续性的积分求解了。

棒棒哒!

 

以题目要计算的0级到3级的期望为例,我们直接取

其中:Pn即为Pnij  (i=0,j=3)

 

举手手:华策华策,为什么要特地把n=150提出来呢?

 

问得好,还记得马尔科夫的三个关键词吗?是的,马尔可夫预测的状态是独立不受之前状态干扰的,而第150次强化必定达到3级一步概率状态矩阵与之前不同,所以不能算到150。其实可以写在一起,但是为了避免出错强调这一点,我把它写到求和公式外面了。

 

这里我们就不考虑0级能不能一步3级的问题了,我们假定他,能!任性!

 

所以我们只把第150次排开

 

那么第150次如何计算呢?

 

让我们先计算出第149次的状态矩阵:

好的,列完了,我们将这个状态概率矩阵先称为矩阵A149

由于第150次必定升到3级,所以此时的一部状态方程为

我们将这个一步状态概率矩阵先称为矩阵λ150

 

所以A150= A149×λ150

 

所以,马尔科夫就靠每一个状态的状态矩阵和每个状态间的概率转移矩阵链接在一起

(妙啊,有没有想起区块链?

 

也即

 

PS:这里要注意矩阵叉乘时的前后顺序

 

理解了马尔科夫的原理,包括保底在内包括之前每10秒刷新的BUFF题在内的各种概率题我们都可以迎刃而解了。所以觉得数列看着头大的朋友们,我们一起看马尔科夫吧!

 

好的,我们回到题目,发现问题已经解决了,以后大家就可以光明正大地装X了,马尔科夫这么简单怎么可能不会!所以,我们总结一下,遇到这种笔试题,不要慌,随便写。作为一个策划,一定要能扯,会扯,扯得有逼格。

 

 

所以,我们这篇文章已经看完一半了!剩下的问题就是如何快速地计算出An或者说如何快速地得到一个矩阵的幂呢?

 

在爬过了诸多巨坑后,目前Excel计算矩阵幂运算的方法有如下几种:

1. 运用公式将1*16的单元格区域构造为4*4的内存数组计算后再利用sumproduct取出值(失败了一部分,而且公式极度复杂= =,有函数大佬读到此处请不吝赐教!)

2. n*4=n的矩阵表(禁言大佬情谊演示,但是我丑拒了……):

3. MMult公式嵌套

a) 这里要注意,Excel中MMult是叉乘,SUMPRODUCT是点乘

b) Excel中power函数与^的作用是一致的,不能够用来计算矩阵的幂

4. Excel自带迭代计算(禁言大佬情谊演示,但是我依然丑拒了……)

5. 数据-规划求解

6. 插件法

7. 自定义函数

8. VBA循环

9. 外接小程序(算了,好像还不如写VBA…

10. 选其他各种语言也可以(算了,好像还不如写VBA…

11. matlab(好主意!)

 

其中最简单方便的应该是自定义函数

好的,写完了,果然简单方便,棒棒哒!

 

好的,测试了下完美运行,棒棒哒!

 

已经得到了如此详尽的表格,期望算起来自然是手到擒来,易如反掌,如探囊取物,唾手可得,轻而易举便可算出!

好的,算完了,棒棒哒!

 

不过初尝马尔科夫,写个10000000次循环模拟验算一下也是可行的

 

好的,写完了,棒棒哒!

好的,运行后结果几乎没有误差,棒棒哒!

 

当然,如果每过一段时间概率矩阵变化会较大的话,建议采用另一种格式,当然也就不需要自定义函数了,而且并不会丑拒!

好的,测试了下完美运行,棒棒哒!

不过借助自定义函数或是lookup还是可以将表构造成之前计算期望的表格,棒棒哒!这里就赘述了。

 

 

本文特别感谢:禁言大佬,从半夜12点多陪着我扯皮,一直陪我到早上6点把文章都写好了,真是感动游戏圈的情谊。

 

扯皮内容大概是这样的:

00:30

大佬:其实你可以不用函数

我:打死我也不会点开VBA的!

 

01:00

我:我找到了一个插件!但是要money……

大佬:我觉得……

我:打死我也不会点开VBA的!

 

01:30

我:我想到了一个绝妙的公式!可惜这里空白的地方太小,写不下……

大佬:我觉得……

我:打死我也不会点开VBA的!

 

2:00

我:我决定去下matlab……

大佬:我觉得……

我:打死我也不会点开VBA的!

 

2:30

大佬:我觉得……(顺带发撸猫截图) 

我:打死我也不会点开VBA的!

 

3:00

大佬:我觉得……

我:VBA真好用!

顺便下次要改个标题:99%的人都能学会的马尔科夫!

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引