首页 > 解决方案 > 如何在 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 方法

标签: pythoncplexdocplex

解决方案


您可以在求解后使用 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

推荐阅读