【发布时间】:2019-07-02 14:17:26
【问题描述】:
我正在处理一个人员分配问题,该问题最初是在 PuLP 中建模的。然而,在开发过程中,一些约束以及目标变得非线性。在比较了一些包后,我选择了GEKKO,但不知何故无法启动并运行我的优化。
我面临两个问题:
1.约束公式
假设我有像these 这样的简单约束。
在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'
我想知道我的约束代码是否正确(变量类型的选择等),以及如何修复拆分目标。感谢您的帮助,因为我已经尝试了不同的变量但无法运行。
【问题讨论】: