Синтаксис целевой функции PuLP неверен - PullRequest
0 голосов
/ 30 августа 2018

У меня возникли проблемы с определением целевой функции для задачи оптимизации планирования. Я просто хочу минимизировать недостаточные мощности. Моя настройка:

import pulp

nr_employees = 61 #len(dfRolePreferences['Naam'])
nr_shifts = 3
nr_roles = 5 #len(dfRolePreferences.columns) - 1
nr_days = 5

employees = range(1,nr_employees + 1)
roles = range(1, nr_roles + 1)
days = range(1, nr_days + 1)
shifts = range(1, nr_shifts + 1)
hours = range(24) #Export proces

D = {}          # Demand matrix
X = {}          # Assignment matrix

Матрица назначения

X = pulp.LpVariable.dicts("X", product(employees, days, shifts, hours), cat=pulp.LpBinary)

Матрица спроса Это кадр данных pandas, который я импортирую из Excel. У него просто три колонки

  • «День недели» - день недели (1-5)
  • 'Час' - определенный часовой интервал (0-23)
  • 'Спрос' - необходимые ресурсы для комбинации

Я преобразую кадр данных спроса в формат целлюлозы:

for d in days: 
    for h in hours:
        D[(d, h)] = pulp.LpVariable(int(dfDemand.loc[(dfDemand['Weekday']==d) & (dfDemand['Hour']==h), "Demand"]))

Но теперь я хочу создать целевую функцию следующим образом:

# Create the problem
scheduling_problem = pulp.LpProblem("Employee Scheduling", pulp.LpMinimize)

obj = None

for d in days:
    for h in hours: 
        obj += (sum(X[(e,d,s,h)] for e in employees for s in shifts) - D[(d,h)])

scheduling_problem += obj
scheduling_problem

Я хочу вычесть значение спроса из X (сумма сотрудников для значения X), но у меня есть ощущение, что этот синтаксис неправильный, чтобы запрограммировать следующую формулу:

enter image description here

Не могли бы вы помочь мне с правильным синтаксисом для этой формулы?

1 Ответ

0 голосов
/ 30 августа 2018

Вы можете смоделировать целевую функцию, написав:

prob += pulp.lpSum(pulp.lpSum([X[(e,d,s,h)] for e in employees for s in shifts] - D[(d,h)]) for d in days for h in hours)

это приводит к той же цели, что и письмо:

obj = pulp.LpAffineExpression()
for d in days:
    for h in hours: 
        obj += pulp.lpSum(X[(e,d,s,h)] for e in employees for s in shifts) - D[(d,h)]

prob+= obj # or  prob.setObjective(obj)

Пример:

import pulp
import itertools

employees = range(2)
days = range(2)
shifts = range(2)
hours = range(2) 


X = pulp.LpVariable.dicts("X", itertools.product(employees, days, shifts, hours), cat=pulp.LpBinary)
D = pulp.LpVariable.dicts("D", itertools.product(days, hours), cat=pulp.LpBinary)


prob = pulp.LpProblem("example", pulp.LpMinimize)

prob+= pulp.lpSum(pulp.lpSum([X[(e,d,s,h)] for e in employees for s in shifts] - D[(d,h)]) for d in days for h in hours)

, что приводит к:

MINIMIZE
-1*D_(0,_0) + -1*D_(0,_1) + -1*D_(1,_0) + -1*D_(1,_1) + 1*X_(0,_0,_0,_0) + 1*X_(0,_0,_0,_1) + 1*X_(0,_0,_1,_0) + 1*X_(0,_0,_1,_1) + 1*X_(0,_1,_0,_0) + 1*X_(0,_1,_0,_1) + 1*X_(0,_1,_1,_0) + 1*X_(0,_1,_1,_1) + 1*X_(1,_0,_0,_0) + 1*X_(1,_0,_0,_1) + 1*X_(1,_0,_1,_0) + 1*X_(1,_0,_1,_1) + 1*X_(1,_1,_0,_0) + 1*X_(1,_1,_0,_1) + 1*X_(1,_1,_1,_0) + 1*X_(1,_1,_1,_1) + 0
...