У меня есть код для управления цепочкой поставок на основе затрат, когда предложение пытается удовлетворить спрос, но это работает только тогда, когда предложение превышает спрос. Есть ли способ оптимизировать его для работы в обоих направлениях (т.е. когда supply > demand
и supply < demand
)?
from pyomo.core import *
model = AbstractModel()
model.warehouses = Set()
model.stores = Set()
model.supply = Param(model.warehouses)
model.demand = Param(model.stores)
model.costs = Param(model.warehouses, model.stores)
model.amounts = Var(model.warehouses, model.stores,
within=NonNegativeReals)
def costRule(model):
return sum(
model.costs[n,i]
for n in model.warehouses
for i in model.stores
)
model.cost=Objective(rule=costRule)
def minDemandRule(model, store):
return sum(model.amounts[i, store] for i in model.warehouses) >=
model.demand[store]
model.demandConstraint = Constraint(model.stores, rule=minDemandRule)
def maxSupplyRule(model, warehouse):
return sum(model.amounts[warehouse, j] for j in model.stores) <=
model.supply[warehouse]
model.supplyConstraint = Constraint(model.warehouses, rule=maxSupplyRule)
Мой вклад:
set warehouses := hyd ban coh;
set stores := cbe mdu cnr whc whe;
param: supply :=
hyd 10
ban 10
coh 10;
param: demand :=
cbe 5
mdu 5
cnr 5
whc 5
whe 5;
param costs:
cbe mdu cnr whc whe:=
hyd 1 3 2 2 1
ban 4 5 1 1 3
coh 2 3 3 2 1;
Здесь supply = 30
и demand = 25
. Это работает, и я получаю переменную:
amounts[ban,cbe]:
Value: 5
amounts[ban,whc]:
Value: 5
amounts[coh,whe]:
Value: 5
amounts[hyd,cnr]:
Value: 5
amounts[hyd,mdu]:
Value: 5
Но это не работает, когда предложение меньше спроса. Здесь supply = 30
и demand = 40
:
param: supply :=
hyd 10
ban 10
coh 10;
param: demand :=
cbe 5
mdu 5
cnr 5
whc 5
whe 20;
param costs:
cbe mdu cnr whc whe:=
hyd 1 3 2 2 1
ban 4 5 1 1 3
coh 2 3 3 2 1;
Мне нужен желаемый результат, как показано ниже: Переменная:
amounts[ban,cbe]:
Value: 5
amounts[ban,whc]:
Value: 5
amounts[coh,whe]:
Value: 10
amounts[hyd,cnr]:
Value: 5
amounts[hyd,mdu]:
Value: 5
whe_demand =10