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|的最小化可以通过引入辅助变量转化为线性约束问题:
- 定义一个非负辅助变量
z,用来表示|y| - 添加约束
z ≥ y和z ≥ -y - 将目标函数设为最小化
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
相关产品推荐
相关产品推荐

