Pyomo + ARIMA: Как обновить данные Pyomo. файл файлом ARIMA и его собственные решения? - PullRequest
0 голосов
/ 19 марта 2020

Я строю абстрактную модель в pyomo, которая направлена ​​на перераспределение автомобилей по четырем зонам. Входы: demand(param.D, passenger requests), supply(param.S, currently available cars) и time cost matrix(param.cost, Tij) между зонами. И эта модель должна развиваться со временем. На выходе должен быть поток автомобиля Xij из зоны I до J.

Я уже построил модель stati c, в которой я вручную набрал спрос, предложение и стоимость в файле .dat. Тем не менее, моя конечная цель - сделать эту модель "динамичной c", взяв значение спроса из модели прогнозирования (ARIMA). Кроме того, поставки (текущие доступные автомобили) взаимосвязаны с решениями, предоставленными моделью на несколько временных шагов go.

Например, для временного шага t до t+dt:

# supply (i, t< t <t+dt) =  sum(Xij(t-Tij < t < t+dt-Tij) for all j in model.J) 
# and demand is from ARIMA.

Код моей модели c:

from __future__ import division
from pyomo.environ import *
from pyomo.opt import SolverFactory
import numpy as np

model = AbstractModel()

model.I = Set()
model.J = Set()

model.cost = Param(model.I, model.J)
model.D = Param(model.I)
model.S = Param(model.I)
# the next line declares a variable indexed by the set J
model.x = Var(model.J, model.I, domain=NonNegativeIntegers)


def obj_expression(model):
    # fuel cost + maintanence assume $1 per min no matter idle or occupied
    fuel_cost = summation(model.cost, model.x)

    # for potential unserved passenger in deficit station, $50 per head
    punishment_unserved = 50 * sum(model.D[i] - sum(model.x[j, i] for j in model.J) for i in model.I if model.D[i] - model.S[i] > 0)

    # for served passenger, assuming average salary rate $50 per hour
    waiting_served = 50 / 60 * sum(sum(model.x[j, i] * model.cost[j, i] for j in model.J) for i in model.I)

    objfun = fuel_cost + punishment_unserved + waiting_served

    return objfun


model.obj = Objective(rule=obj_expression, sense=minimize)


def Rule0(model, i):
    C0 = (sum(model.x[i, j] for j in model.J) == model.S[i])
    return C0


def Rule1(model, i):
    if model.D[i] - model.S[i] > 0:
        # for deficit cluster, inflow should be no more than needed
        C1 = model.D[i] >= sum(model.x[j, i] for j in model.J)
    else:
        # for surplus vehicle, inflow should at least satisfies its own demand
        C1 = model.D[i] <= sum(model.x[j, i] for j in model.J)
    return C1

# can add t max to limit too far transport for instance tmax = 25: prevent traveling from 0 to 3 OPTIONAL####
def Rule2(model,i,j):
    if model.cost[i,j] > 25:
        C2 = model.x[i,j] == 0
    else:
        C2 = model.x[i,j] == model.x[i,j]
    return C2

# the next line creates one constraint for each member of the set model.I
model.Constraint = Constraint(model.I, rule=Rule0)
model.Constraint1 = Constraint(model.I, rule=Rule1)
model.Constraint2 = Constraint(model.I,model.J, rule=Rule2)
# load data
data = DataPortal()
data.load(filename='data2.dat', set=model.I)
data.load(filename='data2.dat', set=model.J)
data.load(filename='data2.dat', param=(model.cost, model.D, model.S))

# create a model instance and optimise
instance = model.create_instance(data)

opt = SolverFactory('cplex')
results = opt.solve(instance)
instance.solutions.store_to(results)
results.write()
# instance.display()

print('Done')

My Файл .dat, который нужно обновить:

set I := 0 1 2 3 ;
set J := 0 1 2 3 ;

param cost :=

0 0 5.449367089
0 1 13.28101266
0 2 23.11075949
0 3 37.1943038
1 0 13.28101266
1 1 5.243037975
1 2 15.1
1 3 29.15632911
2 0 23.11075949
2 1 15.1
2 2 7.317721519
2 3 21.4835443
3 0 37.1943038
3 1 29.15632911
3 2 21.4835443
3 3 8.534177215
;

param D:=
0 5
1 6
2 2
3 0
;
param S:=
0 2
1 8
2 9
3 2
;

У меня также есть файл ARIMA, который сейчас может быть не самым важным. В качестве примера я вручную ввел очень простые значения спроса и предложения. Что касается файла ARIMA, в этом нет ничего особенного, кроме как вызывать в нем другие файлы. Я не хочу делать это слишком грязно. Вы можете просто использовать несколько простых примеров для оценки спроса.

Я понимаю, что это много информации и требует терпения. Подводя итог, моя самая большая проблема заключается в том, как обновить данные модели Pyomo. файл / входные данные с помощью модели прогнозирования и ее собственных решений за несколько временных шагов. Любая помощь могла бы быть полезна. Большое вам спасибо за ваше время !!

...