Решение LP с использованием PuLP с массивом numpy - PullRequest
0 голосов
/ 02 июня 2019

Я хочу использовать матрицу numpy с PuLP для установки ограничений.

У меня матрица 2x4x4, и я хочу использовать эту матрицу для ограничений, но проблема в том, как ее использовать. На самом деле, я сталкиваюсь с проблемой индексации, так как мне приходится перебирать все переменные и исправлять ограничения. Это матрицы.

P = np.array([[[0.7, 0.3,0,0],
               [0,0.7,0.3,0],
               [0,0,0.6,0.4],
               [0,0,0,1]],
              [[0.7,0.3,0,0],
               [0.7,0.3,0,0],
               [0.7,0.3,0,0],
               [0.7,0.3,0,0]]])
C = np.array([[100,80,50,10],[-100,-100,-100,-100]])
beta = 0.9

P матрица - это матрица вероятностей, а вторая - это матрица затрат. Каждая матрица 4x4 отображает вероятность перехода из одного состояния в другое. и мое ограничение

image

Здесь V является переменной.

1 Ответ

1 голос
/ 08 июня 2019

Я собираюсь предположить две вещи:

  1. Что в последнем ограничении вы имеете в виду C [d] [i] справа, а не C [i] [d]... потому что P.shape[0] = d = 2 и C.shape[0] = 2.
  2. То, что вы хотите, чтобы ограничения были для всех d, а также для всех i.

Принимая во внимание вышесказанное, следующее должно делать то, что вы хотите:

from pulp import *
import numpy as np 

P = np.array([[[0.7, 0.3,0,0],
               [0,0.7,0.3,0],
               [0,0,0.6,0.4],
               [0,0,0,1]],
              [[0.7,0.3,0,0],
               [0.7,0.3,0,0],
               [0.7,0.3,0,0],
               [0.7,0.3,0,0]]])

C = np.array([[100,80,50,10],[-100,-100,-100,-100]])

beta = 0.9

set_D = range(0, P.shape[0])
set_I = range(0, P.shape[1])

# Generate proble, & Create variables
prob = LpProblem("numpy_constraints", LpMinimize)
V = pulp.LpVariable.dicts("V", set_I, cat='Continuous')

# Make up an objective, let's say sum of V_i
prob += lpSum([V[i] for i in set_I])

# Apply constraints
for d in set_D:
    for i in set_I:
        prob += V[i] - beta*lpSum([P[d][i][j]*V[j] for j in set_I]) >= C[d][i]

# Solve problem
prob.solve()

# Print results:
V_soln = np.array([V[i].varValue for i in set_I])
print (("Status:"), LpStatus[prob.status])
print("V_soln: ")
print(V_soln)

С помощью которого я получаю следующее.Я не проверял, что ваши ограничения удовлетворены, но они должны быть.

Status: Optimal
V_soln: 
[690.23142 575.50231 492.35502 490.23142]
...