首页 > 解决方案 > gurobi有具体的绝对值法吗?

问题描述

我想在我的目标函数中计算两个矩阵之和的绝对值,但由于某种原因,我不断收到错误消息“一元的错误操作数类型 -:'GenExpr'”。

#Data
hyperparameter = 0.5
weightss = np.array([0.25, 0.25, 0.25, 0.25])
weightss
transactional_costs = np.array([0.01, 0.01, 0.01, 0.01])
transactional_costs

# Add matrix variable for the stocks
x = m.addMVar(len(stocks))

# Objective is to maximize the return rate and minimize the risk
portfolio_objective = delta @ x - hyperparameter * (x @ sigma @ x) - gp.abs_(transactional_costs @ realweights - transactional_costs @ weightss)

m.setObjective(portfolio_objective, GRB.MAXIMIZE)

我已经尝试计算线外的绝对值的部分portfolio_objective,但我仍然遇到同样的问题。有人可以给我一个方向吗?

更新:数据来自雅虎财经

closes = np.transpose(np.array(data.Close)) # matrix of daily closing prices
absdiff = np.diff(closes)                   # change in closing price each day
reldiff = np.divide(absdiff, closes[:,:-1]) # relative change in daily closing price
delta = np.mean(reldiff, axis=1)            # mean price change
sigma = np.cov(reldiff)                     # covariance (standard deviations)
std = np.std(reldiff, axis=1)               # standard deviation

标签: pythonabsolutegurobiabsolute-value

解决方案


我在 Gurobi 工作,我刚刚检查了源代码并验证绝对值函数不适用于 Gurobi Python (gurobipy) 矩阵接口。所以你有两个选择:

  1. 使用代数语法,它支持绝对值通用表达式。

  2. 自己建模绝对值函数;由于您的绝对值函数是凸的,您可以使用标准数学变换来替换abs(z)zp+zn其中z=zp-znzp,zn是非负决策变量,分别代表绝对值函数的正和负部分。


推荐阅读