Python GUROBIRROR:Q矩阵不是半正定(PSD)

Python GUROBIRROR:Q矩阵不是半正定(PSD),python,matrix,model,psd,gurobi,Python,Matrix,Model,Psd,Gurobi,我需要用python编写一个模型,用gurobi解决它。 该模型包含一个平方根: ∑(hza)*√(SI+T-R))(这是目标函数) 因为Gurobi不支持平方根,所以我将目标函数转换如下: ∑(hza*Z)(目标函数) SI+T-R=0(额外约束) 但现在古罗比仍然给出了一个错误:古罗比错误:Q矩阵不是半正定(PSD) 我如何让古洛比解决这个模型? 代码:(从143行开始直到199行) #创建目标 对于中介地产的j: 对于需求阶段中的d: m、 setObjective(quicksum(h[

我需要用python编写一个模型,用gurobi解决它。 该模型包含一个平方根: ∑(hza)*√(SI+T-R))(这是目标函数)

因为Gurobi不支持平方根,所以我将目标函数转换如下: ∑(hza*Z)(目标函数)

SI+T-R=0(额外约束)

但现在古罗比仍然给出了一个错误:古罗比错误:Q矩阵不是半正定(PSD)

我如何让古洛比解决这个模型? 代码:(从143行开始直到199行)

#创建目标
对于中介地产的j:
对于需求阶段中的d:
m、 setObjective(quicksum(h[d]*Z*VarDemand[d]*Z2[d]用于需求阶段中的d)+quicksum(h[j]*Z*Z1[j]*Var[j]用于中间阶段中的j),GRB.最小化)
#添加约束
对于中介地产的j:
m、 addConstr(R[j]-SI[j]=0)
m、 优化()
打印SI[j]
打印R[j]
回溯(最近一次呼叫最后一次): 文件“C:\gurobi600\win32\examples\python\safetyStock.py”,第230行,在 安全库存(需求、中间、阿尔法) 文件“C:\gurobi600\win32\examples\python\safetyStock.py”,第192行,在safetyStock中 m、 优化() 文件“model.pxi”,第536行,在gurobipy.model.optimize(../../src/python/gurobipy.c:37543)中
GUROBIRROR:Q矩阵不是半正定(PSD)

形式为Z2[d]*Z2[d]的表达式是凸的,但你在a的右边有它谁能帮我?这不是一个好问题。你可能想把它改写得更好,更好?我只是需要帮助来消除错误,以便古罗比能够解决模型,但我真的不知道如何做到这一点…很棒的东西。我已经投了赞成票,试图帮助你得到答案。不幸的是,我对古罗比一无所知,但希望有人能帮助你。你会犯这个错误,因为你的约束中有非线性项,比如
SI+T-rac根据古罗比的网站,古罗比确实支持二次规划和二次约束规划。。。我错了吗?非常感谢。我接受了你的建议和内置的分段线性特征!
#create objective
for j in intermediateStage:
    for d in demandStage:
            m.setObjective(quicksum(h[d]*Z*VarDemand[d]*Z2[d] for d in demandStage)+quicksum(h[j]*Z*Z1[j]*Var[j] for j in intermediateStage),GRB.MINIMIZE)

#addconstraints
for j in intermediateStage:
    m.addConstr(R[j]-SI[j]<=T[j])

for d in demandStage:
    m.addConstr(R[d]-SI[d]<=T[d])

for k in supplyStage:
    m.addConstr(R[k]-SI[k]<=T[k])

for j in intermediateStage:
    m.addQConstr(SI[j]+T[j]-R[j]<=Z1[j]*Z1[j])

for d in demandStage:
    m.addQConstr(SI[d]+T[d]-R[d]<=Z2[d]*Z2[d])

for k in supplyStage:
    for j in intermediateStage:
        m.addConstr(R[k]-SI[j]<=0)

for j in intermediateStage:
    for d in demandStage:
        m.addConstr(R[j]-SI[d]<=0)

for d in demandStage:
    m.addConstr(R[d]<=E[d])

for k in supplyStage:
    m.addConstr(SI[k]==0)

for k in supplyStage:
            m.addConstr(SI[k]>=0)
for k in supplyStage:
            m.addConstr(R[k]>=0)

for d in demandStage:
    m.addConstr(SI[d]>=0)
for d in demandStage:
    m.addConstr(R[d]>=0)
for d in demandStage:
    m.addConstr(Z2[d]>=0)

for j in intermediateStage:
    m.addConstr(SI[j]>=0)
for j in intermediateStage:
    m.addConstr(R[j]>=0)
for j in intermediateStage:
    m.addConstr(Z1[j]>=0)

m.optimize()
print SI[j]
print R[j]