马尔科夫决策——经济管理问题的R实现

马尔可夫(Markov)决策法,就是一种关于事件发生的概率预测方法。它是根据事件的目前状况来预测其将来各个时刻(或时期)变动状况的一种预测方法。马尔可夫决策法是产业预测研究中重要的预测方法之一,现代市场信息复杂多变,某个产业或企业在激烈的市场竞争环境下要生存和发展就必须对其产品进行市场预测,从而减少产业或企业参与市场竞争的盲目性,提高科学性。然而,市场对某产品的需求受多种因素的影响,其特性是它在市场流通领域中所处的状态。这些状态的出现是一个随机现象,具有随机性。为此,利用随机过程理论的马尔可夫(Markov)模型来分析产品在市场上的状态分布,进行市场预测,从而科学地指导组织生产,减少盲目性,以提高企业的市场竞争力和其产品的市场占有率。

一、经济管理中的应用

1.1 产业化发展

案例1:考虑某地区农业收成变化的3个状态,即“丰收”、“平收”和“歉收”。记E1为“丰收”状态,E2为“平收”状态,E3为“歉收”状态。下表给出了该地区1991—2030年期间农业收成的状态变化情况。试计算该地区农业收成变化的状态转移概率矩阵。

年份 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000
序号 1 2 3 4 5 6 7 8 9 10
状态 E1 E1 E2 E3 E2 E1 E3 E2 E1 E2
年份 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010
序号 11 12 13 14 15 16 17 18 19 20
状态 E3 E1 E2 E3 E1 E2 E1 E3 E3 E1
年份 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020
序号 21 22 23 24 25 26 27 28 29 30
状态 E3 E3 E2 E1 E1 E3 E2 E2 E1 E2
年份 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030
序号 31 32 33 34 35 36 37 38 39 40
状态 E1 E3 E2 E1 E1 E2 E2 E3 E1 E2

1.2 城镇化进程

案例2:城镇化进程中,农村人转移为城市人的概率为0.5,城市人转移为农村人的概率为0.1。**其转移矩阵为

农村人 城市人
农村人 0.5 0.5
城市人 0.1 0.9

若一开始有100个农村人,0个城市人,试给出最终人口分布情况。

1.3 选举投票趋势

以美国大选为例,首先取得过去十次选举的历史数据,然后根据历史数据得到选民意向的转移矩阵。

\[\begin{aligned} & \begin{array}{llll} &&到D && R &&L \end{array} \\ & \begin{array}{l} 从D \\ R \\ L \end{array}\left[\begin{array}{llll} 0.7 & 0.2 & 0.1\\0.1 & 0.8 &0.1 \\0.3& 0.3 &0.4 \end{array}\right] \\ & \end{aligned} \]

标志为"D" 的第一行中的数值刻画在一次选举中为民主党投票的人在下一次选举中将如何投票的百分比。这里我们已经假设 70%的人在下一次选举中再一次投"D"的票,20%的人将投共和党"R"的票,10%的人将投自由党"L"的票。

二、马尔科夫平稳分布R实现

2.1 案例1计算

options(digits=3)
library(markovchain)
library(tidyverse)
library(expm)
library(diagram)
library(openxlsx)

tb456=read.xlsx('markov.xlsx') %>% mutate(state1=lag(state))

#交叉统计,变量state1转为state的个数
tss= table(tb456[,4],tb456[,3])
#返回交叉表的频率,即状态转移概率矩阵
tmA=prop.table(tss,1) 
#可视化
plotmat(tmA,pos = c(1,2), lwd = 1, box.lwd = 2, cex.txt = 0.8, 
          box.size = 0.1, box.type = "circle", box.prop = 0.5,
          box.col = "light blue",  arr.length=.1, arr.width=.1,
          self.cex = .6,self.shifty = -.01,self.shiftx = .15, main = "Markov Chain")

#初始状态
 inital=matrix(c(0,1,0),nrow=1, byrow=TRUE)
#预测下一年
   fc15=inital %*% tmA
#预测下两年
  fc16=inital %*% tmA%*% tmA
#预测第三年,tmA%^% 3相当于tmA%*% tmA%*%tmA
  fc17=inital %*% (tmA%^% 3)
#要进行多年外推,编写一个函数
  myfunction=function(n){ inital %*% (tmA%^% n) }
  mats=matrix(data = NA,nrow = 11,ncol = 3) %>%  data.frame()
#预测11年,用一个dataframe来进行结果存储
  for (i in 1:11) {
       mats[i,]=myfunction(i)
  } 
mats
      X1    X2    X3
1  0.538 0.154 0.308
2  0.302 0.415 0.283
3  0.387 0.333 0.280
4  0.359 0.359 0.282
5  0.368 0.351 0.281
6  0.365 0.353 0.282
7  0.366 0.353 0.282
8  0.365 0.353 0.282
9  0.366 0.353 0.282
10 0.366 0.353 0.282
11 0.366 0.353 0.282

2.2 案例2计算

options(digits=3)
library(markovchain)
library(tidyverse)
library(expm)
library(diagram)
tmA=matrix(c(0.5,0.1,0.5,0.9),ncol=2)
#可视化
plotmat(tmA, lwd = 1, box.lwd = 2, cex.txt = 0.8, 
        box.size = 0.1, box.type = "circle", box.prop = 0.5,
        box.col = "light blue",  arr.length=.1, arr.width=.1,
        self.cex = .6,self.shifty = -.01,self.shiftx = .15, main = "Markov Chain")

#初始状态
 inital=matrix(c(0,1,0),nrow=1, byrow=TRUE)
#预测下一年
   fc15=inital %*% tmA
#预测下两年
  fc16=inital %*% tmA%*% tmA
#预测第三年,tmA%^% 3相当于tmA%*% tmA%*%tmA
  fc17=inital %*% (tmA%^% 3)
#要进行多年外推,可以编写一个函数
  myfunction=function(n){ inital %*% (tmA %^% n) }
  mats=matrix(data = NA,nrow = 11,ncol = 2) %>%  data.frame()
#预测11年,用一个dataframe来进行结果存储
  for (i in 1:11) {
       mats[i,]=myfunction(i)
  }

根据平稳概率[0.17,0.83],100人只有17人最后还留在农村,83人流向了城市。

2.3 案例3计算

import matplotlib.pyplot as plt
RLIST = [0.33333]
DLIST = [0.33333]
ILIST = [0.33333]
for i in range(40):
    D = RLIST[i]*0.70 + DLIST[i]*0.10 + ILIST[i]*0.30
    DLIST.append(D)
    R = RLIST[i] * 0.20 + DLIST[i] * 0.80 + ILIST[i] * 0.30
    RLIST.append(R)
    I = RLIST[i]*0.10 + DLIST[i]*0.10 + ILIST[i]*0.40
    ILIST.append(I)
plt.plot(RLIST)
plt.plot(DLIST)
plt.plot(ILIST)
plt.xlabel('Time')
plt.ylabel('Voting percent')
plt.annotate('DemocraticParty',xy = (5,0.2))
plt.annotate('RepublicanParty',xy = (5,0.5))
plt.annotate('IndependentCandidate',xy = (5,0.25))
plt.show()
print(RLIST,DLIST,ILIST)

平稳分布为[0.455,0.402,0.143],得到的长期趋势是:45.5%的人选民主党、40.2%的人选共和党、14.3%的人选自由党候选人。

参考文献

  1. 数学建模常用算法—马尔可夫预测
  2. 马尔可夫链及其平稳状态
posted @ 2023-04-18 18:09  郝hai  阅读(171)  评论(0编辑  收藏  举报