PuLp: минимальные и максимальные пороги для ограничений lpSum

У меня есть большая модель линейного программирования, которую я пытаюсь решить с помощью PuLp. Пока все идет отлично, за исключением того, что я наткнулся на загвоздку при попытке установить минимумы и максимумы для каждой «строки» в моей переменной dict. В приведенном ниже примере я хотел бы иметь минимальное и максимальное количество животных на площади, как указано.

Имена переменных были изменены на "собаки" и "кошки" для упрощения.

import pulp as lp 

prob = lp.LpProblem("test problem", lp.LpMaximize)

# in reality I have 20,000 areas
areas = [1, 2, 3]

costs = {1: 300,
         2: 310,
         3: 283}

dogs = {1: 150,
        2: 300,
        3: 400}
# Max cats per area
cats = {1: 400,
        2: 140,
        3: 0}

# minimum dogs per area
min_dogs = {1: 50,
            2: 5,
            3: 80}

# min cats per area
min_cats = {1: 5,
            2: 24,
            3: 0}

prob = lp.LpProblem("Example for SO", lp.LpMinimize)

# Setup variables

dog_vars = lp.LpVariable.dicts('dogs', dogs, 0)
cat_vars = lp.LpVariable.dicts('cats', cats, 0)

# Objective:
prob += lp.lpSum([costs[i] * (dog_vars[i] + cat_vars[i]) for i in areas])

# Constraints
prob += lp.lpSum([costs[i] * (dog_vars[i] + cat_vars[i]) for i in areas]) <= 50000
# Constraints not working:
prob += lp.lpSum([dog_vars[i] - min_dogs[i] for i in dogs]) >= 0
prob += lp.lpSum([cat_vars[i] - min_cats[i] for i in cats]) >= 0


prob.solve()
print("Status:", lp.LpStatus[prob.status])

for v in prob.variables():
    print(v.name, "=", v.varValue)

print("Total # of km to be done", lp.value(prob.objective))

Результаты следующие. Проблема в том, что для каждой из этих переменных должно быть значение не меньше, чем в min_cats и min_dogs. Он присвоил значение одной области для кошек и собак вместо того, чтобы распространять ее.

('Status:', 'Optimal')
('cats_1', '=', 0.0)
('cats_2', '=', 0.0)
('cats_3', '=', 29.0)
('dogs_1', '=', 0.0)
('dogs_2', '=', 0.0)
('dogs_3', '=', 135.0)
('Total # of km to be done', 46412.0)
[Finished in 0.7s]

Как я могу назначить минимальную и максимальную границы на уровне строки?


person dassouki    schedule 07.10.2015    source источник


Ответы (1)


В настоящее время вы устанавливаете минимум / максимум суммы ваших собак / кошек. Попробуйте следующее:

for i in areas:
  prob += dog_vars[i] >= min_dogs[i] 
  prob += dog_vars[i] <= max_dogs[i]
  prob += cat_vars[i] >= min_cats[i]
  prob += cat_vars[i] <= max_cats[i] 

Удачи моделированию в PuLP :)

person Koen Peters    schedule 08.10.2015