【问题标题】:How to Formulate a Pulp Objective Function with a max operator如何用最大运算符制定纸浆目标函数
【发布时间】:2020-09-13 18:22:37
【问题描述】:

我正在尝试为 PuLP 中的成本优化制定一个目标函数,其中将数组的最大值添加到目标函数中。请忽略缩进。

#Decision Variables
allocation_vars = LpVariable.dicts(
    'Allocation',
    [(i,j,k) for i in TruckTypes for j in Days for k in RS],
    0,
    LpInteger
)

#Objective Function
for i in TruckTypes:
    for j in Days:
        prob += max(allocation_vars[(i, j, k)] * TransCost[i][k] for k in RS)

我在尝试运行上述内容时收到以下错误:

prob += max(allocation_vars[(i, j, k)] * TransCost[i][k] for k in RS)

TypeError: '>' not supported between instances of 'LpAffineExpression' and 'LpAffineExpression'

【问题讨论】:

  • max() 不是线性函数,因此这违反了对线性目标函数的要求......你将不得不重新制定。
  • 根据问题的逻辑,重新制定似乎是不可行的。你能推荐一个可以解决上述整数非线性优化问题的python包/求解器吗?

标签: python optimization linear-programming pulp integer-programming


【解决方案1】:

您应该按照@AirSquid 所说的重新表述。

尝试以下方法:

  1. 创建一个虚拟变量m[i][j],将其添加到目标函数中;
m = LpVariable.dicts(
    'maxCosts',
    [(i,j) for i in TruckTypes for j in Days],
    0,
    LpInteger
)

prob += lpSum([m[i][j] for j in Days for j in TruckTypes])
  1. 添加以下约束:
for i in TruckTypes:
    for j in Days:
        for k in RS:
            prob += allocation_vars[(i,j,k)]*TransCost[i][k] <= m[i][j]

假设您有一个最小化问题,这将与max 完全相同:它将尽可能减少m[i][j],并且要减少更多,它将尝试减少所有@987654327 的最大值@。

【讨论】:

  • 哇!伟大的逻辑!这个虚拟变量 m[i][j] 是否也应该被声明为决策变量?因为,它的值将由求解器决定......
猜你喜欢
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多