【问题标题】:Extended Raftery Markov Chain function minimization using python使用python扩展Raftery Markov链函数最小化
【发布时间】:2018-09-01 04:14:08
【问题描述】:

我正在研究扩展的 Raftery 模型,它是一种更通用的高阶马尔可夫链模型,因为我需要解决以下具有某些约束的线性规划模型。

以下是需要最小化的(链接)线性规划函数:

受制于:

其中向量“W”和“λ”要在方程中求解。

Q 和 X 分别是 i 步转移概率矩阵和稳态概率。

以下是我正在使用的示例:

import numpy as np

one_step_array = np.array([[0.12, 0.75, 0.12],
       [0.42, 0.14, 0.42],
       [0.75, 0.25, 0.0]])

two_step_array = np.array([[0.43, 0.23, 0.33],
       [0.43, 0.44, 0.11],
       [0.20, 0.59, 0.20]])

steady_state = np.array([0.38, 0.39, 0.21])

Q_Arr = np.vstack((np.matmul(one_step_array,steady_state),np.matmul(two_step_array,steady_state))).transpose()

from pulp import *

w1 = LpVariable("w1",0,None)
w2 = LpVariable("w2",0,None)
w3 = LpVariable("W3",0, None)
L1 = LpVariable("L1",0,None)
L2 = LpVariable("L2",0,None)

prob = LpProblem("Problem",LpMinimize)

prob += w1 >= steady_state[0] - Q_Arr[0][0]*L1 - Q_Arr[0][1]*L2
prob += w1 >= -steady_state[0] + Q_Arr[0][0]*L1 + Q_Arr[0][1]*L2

prob += w2 >= steady_state[1] - Q_Arr[1][0]*L1 - Q_Arr[1][1]*L2
prob += w2 >= -steady_state[1] + Q_Arr[1][0]*L1 + Q_Arr[1][1]*L2

prob += w3 >= steady_state[2] - Q_Arr[2][0]*L1 - Q_Arr[2][1]*L2
prob += w3 >= -steady_state[2] + Q_Arr[2][0]*L1 + Q_Arr[2][1]*L2

prob += w1 >= 0
prob += w2 >= 0
prob += w3 >= 0
prob += L1 >= 0
prob += L2 >= 0

prob += L1 + L2 == 1

prob += w1+w2+w3

status = prob.solve(GLPK(msg=0))
LpStatus[status]

print (value(w1))
print (value(w2))
print (value(w3))
print (value(L1))
print (value(L2))

结果是 (λ1,λ2,w1,w2,w3) = (1,0,0.051,0.027,0.14) 而不是 (1,0,0.028,0.0071,0.0214),这是不正确的。

你能告诉我我哪里出错了吗?

【问题讨论】:

  • 嗨 Nadipineni,欢迎来到 SO! IMO,如果您发布迄今为止尝试的最小版本并且准确哪里出了问题以及哪里出了问题,这将有很大帮助
  • @en_Knight 我很乐意向您展示我的尝试。但是,我对如何从这里开始一无所知。任何建议将不胜感激。
  • @en_Knight 嘿!我试过解决它。我能够正确获取 Lamda 值,但是我的 W 向量不正确。请你现在检查一下,让我知道我哪里出错了

标签: python numpy scipy markov-chains markov-models


【解决方案1】:

感谢您的评论和帮助!我能够自己回答这个问题。这是解决方案:

from pulp import *


Weight_vec = []
Number_of_states = Q_Arr.shape[0]
for x in range(Number_of_states):
    Weight_vec.append('w'+str(x+1))

L1 = LpVariable("L1",0,100)
L2 = LpVariable("L2",0,100)

prob = LpProblem("Problem",LpMinimize)

for s in range(Number_of_states):
    Weight_vec[s] = LpVariable('w'+str(s+1),0,None)
count = 0

for row in Q_Arr:
    prob += steady_state[0] - row[0]*L1 - row[1]*L2 - Weight_vec[count] <= 0
    print (steady_state[0] - row[0]*L1 - row[1]*L2 - Weight_vec[count] <= 0)
    prob += - steady_state[0] + row[0]*L1 + row[1]*L2 - Weight_vec[count] <= 0
    print (- steady_state[0] + row[0]*L1 + row[1]*L2 - Weight_vec[count] <= 0)
    count = count + 1

prob += L1 >= 0
prob += L2 >= 0

prob += L1 + L2 == 1

for s in range(Number_of_states):
    prob += Weight_vec[s] >= 0

#objective
prob += sum(Weight_vec)

status = prob.solve(GLPK(msg=0))
LpStatus[status]

result = []

for s in range(Number_of_states):
    result.append(value(Weight_vec[s]))
result.append(value(L1))
result.append(value(L2))

print (result)

【讨论】:

    猜你喜欢
    • 2017-07-28
    • 2018-02-16
    • 2021-10-25
    • 2017-12-31
    • 2018-01-30
    • 2015-02-18
    • 2020-10-06
    • 1970-01-01
    相关资源
    最近更新 更多