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
相关产品推荐
相关产品推荐

