Я работаю над проблемой назначения персонала , которая была первоначально смоделирована в PuLP
. Однако во время разработки некоторые ограничения, а также цель стали нелинейными. После сравнения некоторых пакетов я выбрал GEKKO , но почему-то не могу запустить мою оптимизацию.
У меня две проблемы:
1. Формулировка ограничения
Давайте предположим, что у меня есть простые ограничения, такие как эти .
В PuLP
У меня есть что-то вроде:
# Each position p must be assigned to exactly one employee e
for p in position_names:
succession_prob += pulp.lpSum([X[p][e] for e in employee_names]) == 1
# Only employees e that are qualified for position p can be selected
for p in position_names:
for e in employee_names:
succession_prob += X[p][e] <= position_mapping[p][e]
И я попытался сделать что-то подобное в GEKKO
:
# Each position p must be assigned to exactly one employee e
for p in range(len(position_names)):
m.Equation(sum(X[p][e] for e in range(len(employee_names))) == 1)
# Only employees e that are qualified for position p can be selected
for p in range(len(position_names)):
for e in range(len(employee_names)):
m.Equation(X[p][e] <= position_mapping.iloc[e][p])
Это не дает мне ошибки, но я не уверен, правильно ли это. Однако я получаю сообщение об ошибке при попытке разбить (довольно сложную) целевую функцию:
2. Сплит-функция цели
# Dummy functions
numerator = pulp.lpSum(some expression)
denominator = pulp.lpSum(some other expression)
succession_prob += numerator / denominator
Снова я попытался сделать что-то подобное в GEKKO
:
numerator = m.Param(some expression)
denominator = m.Param(some other expression)
# Objective function: RCD moves -> max
m.Obj((numerator / denominator)*(-1))
>>> ERROR: unsupported operand type(s) for *: 'float' and 'generator'
Мне интересно, правильный ли мой код для ограничений (выбор типов переменных и т. Д.), А также как исправить цель разделения. Я благодарен за любую помощь, так как я уже опробовал различные переменные и просто не могу его запустить.