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

Gurobi是否有专用绝对值计算方法?调用时报GenExpr错误如何解决

问题原因分析
  • Gurobi确实内置了绝对值计算函数gp.abs_(),你的报错根源是:绝对值运算返回的*广义表达式(GenExpr)*不能直接和二次型表达式混合后作为目标函数传入,直接在目标函数里嵌套绝对值运算的写法不符合Gurobi矩阵API的调用规范。
  • 代码中存在隐性问题:你没有定义变量realweights,如果该变量指代你声明的权重变量x,需要直接用x参与运算,否则也会触发类型匹配错误。
解决方法

你需要引入辅助变量承接绝对值运算的结果,通过约束绑定绝对值关系后,再把辅助变量代入目标函数计算,修改后的代码如下:

#Data 原有定义不变
hyperparameter = 0.5
weightss = np.array([0.25, 0.25, 0.25, 0.25])
transactional_costs = np.array([0.01, 0.01, 0.01, 0.01])

# Add matrix variable for the stocks
x = m.addMVar(len(stocks))
# 新增辅助变量存储绝对值结果,绝对值非负所以设置下界为0
abs_cost_diff = m.addMVar(1, lb=0)
# 添加绝对值约束,这里假设realweights就是你定义的权重变量x,如有调整替换为对应变量即可
m.addConstr(abs_cost_diff == gp.abs_(transactional_costs @ x - transactional_costs @ weightss))

# 目标函数改用辅助变量计算
portfolio_objective = delta @ x - hyperparameter * (x @ sigma @ x) - abs_cost_diff
m.setObjective(portfolio_objective, GRB.MAXIMIZE)

如果需要计算逐元素的绝对值而非标量差值的绝对值,只需要把辅助变量abs_cost_diff的维度调整为和差值结果的维度一致,约束写法保持不变即可。

内容的提问来源于stack exchange,提问作者edwina lai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:39:03