You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python CPLEX优化模型中对线性表达式取绝对值报错,如何解决?

解决docplex中目标函数绝对值的TypeError问题

Python内置的abs()函数无法处理docplex的LinearExpr对象,这就是你遇到TypeError: bad operand type for abs(): 'LinearExpr'的原因。下面提供两种可行的解决方法:

方法一:使用docplex内置的绝对值方法

直接调用模型对象的abs()方法处理线性表达式,这是最简洁的方式,docplex会自动完成绝对值的线性化转换:

from docplex.mp.model import Model
model = Model()
x = model.integer_var_list(9,lb=0, name='x')
y = sum(var for var in x[0:9])
# 替换内置abs为model.abs()
obj = model.abs(y)
model.set_objective('min', obj)

方法二:手动线性化绝对值

绝对值函数|y|的最小化可以通过引入辅助变量转化为线性约束问题:

  1. 定义一个非负辅助变量z,用来表示|y|
  2. 添加约束z ≥ y和z ≥ -y
  3. 将目标函数设为最小化z

代码实现如下:

from docplex.mp.model import Model
model = Model()
x = model.integer_var_list(9,lb=0, name='x')
y = sum(var for var in x[0:9])
# 引入非负辅助变量z
z = model.continuous_var(lb=0, name='z')
# 添加绝对值对应的线性约束
model.add_constraint(z >= y)
model.add_constraint(z >= -y)
# 最小化z等价于最小化|y|
model.set_objective('min', z)

两种方法都能解决你的问题,方法一更适合快速实现,方法二则能让你清楚绝对值线性化的底层逻辑,可根据需求选择。

内容的提问来源于stack exchange,提问作者Nguyen Ha Trang VNUIS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 01:35:01