Оптимизация PYOMO для удовлетворения спроса ‹

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

person Vigneshwar A    schedule 07.01.2019    source источник
comment
Похоже, что форматирование вашего вопроса требует небольшой работы, так как его трудно читать в его нынешней форме.   -  person Qi Chen    schedule 08.01.2019
comment
@QiChen Извините за это. Я думаю, теперь все должно быть в порядке   -  person Vigneshwar A    schedule 08.01.2019


Ответы (1)


Похоже, ваша модель неосуществима, когда спрос превышает предложение из-за ограничения model.demandConstraint. Объемы отгрузки не могут удовлетворить спрос, поскольку в противном случае будет нарушено другое ограничение model.supplyConstraint.

Если вы хотите наказать за неудовлетворение спроса, вы можете определить резервные переменные для соответствующего ограничения и добавить эти термины к цели.

Эта книга может стать для вас хорошим источником: https://www.wiley.com/en-us/Model+Building+in+MatMathematical+Programming%2C+5th+Edition-p-9781118443330

person Qi Chen    schedule 08.01.2019