【问题标题】:How to express a quadratic objective in Docplex on python如何在 Docplex on python 中表达二次目标
【发布时间】:2021-04-11 17:22:21
【问题描述】:

如果有人可以帮忙,我无法表达目标函数,这是我的代码:

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 方法

【问题讨论】:

    标签: python cplex docplex


    【解决方案1】:

    您可以在求解后使用 numpy 进行一些计算,但应使用 docplex 中的函数来描述约束。

    例如,making optimization easy with 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
    

    【讨论】:

    • 感谢 Alex 的重播,我仍然有一个问题,因为求解器将 w 作为列表查找,而目标函数使用 w.T,如果 w 不是数组,则可以计算。你能再给我一个建议吗?
    • 我从 objectif 函数中删除了 w.T,我得到了这个错误:Cannot raise 0.000w_0^2+0.000w_0*w_1+0.000w_0*w_2+0.000w_0*w_3+0.000w_0*w_4+0.000w_1 ^2+0.000w_1*w_2+0.000w_1*w_3+0.000w_1*w_4+0.000w_2^2+0.000w_2*w_3+0.000w_2*w_4+0.000w_3^2+0.000w_3*w_4+0.000w_4^2的幂0.5。变量的指数必须是 0、1 或 2。
    • 是不是因为 w 被声明为一个列表:w = mdl.integer_var_list(5,5,30, 'w')
    • Model.minimize 接受线性或二次表达式,Docplex 中没有平方根运算符(实际上在任何 CPLEX API 中)。二次表达式可以通过 x**2 中的线性表达式或幂表达式相乘来形成。
    猜你喜欢
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    相关资源
    最近更新 更多