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

一、经济管理中案例

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

年份 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

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

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

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

二、马尔科夫平稳分布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人流向了城市。

参考文献

  1. 数学建模常用算法—马尔可夫预测
  2. 马尔可夫链及其平稳状态