python - 如何在 Docplex on python 中表达二次目标
问题描述
如果有人可以提供帮助,我无法表达目标函数,这是我的代码:
import numpy as np
def portfolio_return( weights, returns):
return weights.T @ returns
def portfolio_vol( weights, covmatrix):
return np.sqrt(weights.T @ covmatrix @ weights)
def sharp_ratio(er,covmat,w,rf = 0.01):
r_p = portfolio_return(w, er)/100
sigma_p = portfolio_vol(w,cov)/100
return (r_p-rf)/sigma_p
w = mdl.integer_var_list(5,5,30, 'w')
mdl.add_constraint(mdl.sum(w) == 100)
mdl.minimize(-sharp_ratio(quartered_er, cov,np.array(w)))
但我得到这个错误:
ufunc 循环不支持 QuadExpr 类型的参数 0,它没有可调用的 sqrt 方法
解决方案
您可以在求解后使用 numpy 进行一些计算,但应使用 docplex 中的函数来描述约束。
例如,使用 python故事使优化变得容易的二次示例
from docplex.mp.model import Model
mdl = Model(name='buses')
nbbus40 = mdl.integer_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
mdl.minimize(nbbus40**2*500 + nbbus30**2*400)
mdl.solve()
for v in mdl.iter_integer_vars():
print(v," = ",v.solution_value)
import numpy as np
print("We bring ",np.array(
[40,30])@np.array([nbbus40.solution_value,nbbus30.solution_value])
," kids to the zoo")
给
nbBus40 = 4.0
nbBus30 = 5.0
We bring 310.0 kids to the zoo
推荐阅读
- node.js - Puppeteer 无法启动 chrome ,加载共享库时出错
- javascript - Next.js 11:无法读取未定义的属性“canonicalBase”
- javascript - TypeScript 接口和构造函数
- c++ - 使用 C++ 画家绘制一个插值多边形
- python - Python 读取屏幕的特定部分并根据它们采取行动
- python - 如何在 alpine 中使用来自 apk 的 python 包
- python - 日期范围分组数据框中的重叠
- javascript - 使用 javascript 隐藏 iframe
- c++ - C++ 头文件中的静态内联函数
- vhdl - VHDL可以合成clk'event吗?