Я строю абстрактную модель в 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. файл / входные данные с помощью модели прогнозирования и ее собственных решений за несколько временных шагов. Любая помощь могла бы быть полезна. Большое вам спасибо за ваше время !!