У меня есть некоторый код для управления цепочкой поставок, основанный на стоимости, когда попытки поставок удовлетворяют спрос, но это работает только тогда, когда предложение превышает спрос. Можно ли каким-то образом оптимизировать его для работы обоими способами (т.е. когда 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
. Это работает, и я получаю вывод
Variable:
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;
Мне требуется желаемый вывод, как показано ниже:
Variable:
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