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

时间:2015-08-10 09:35:27

标签: python matrix model psd gurobi

我需要在python中编写一个模型来用gurobi来解决它。 该模型包含一个平方根: Σ(h z a *√(SI + T-R))(这是目标函数)

因为Gurobi不支持平方根,所以改变了目标函数如下: Σ(h z a * Z)(目标函数)

SI + T-R< = Z * Z(额外约束)

Z> = 0(额外约束)

但是现在Gurobi仍然会出错:GurobiError:Q矩阵不是半正定(PSD)

如何让Gurobi解决这个模型? 代码:(从第143行开始直到第199行)

#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]

追踪(最近一次通话):   文件“C:\ gurobi600 \ win32 \ examples \ python \ safetyStock.py”,第230行,中     safetystock(需求,中间,阿尔法)   文件“C:\ gurobi600 \ win32 \ examples \ python \ safetyStock.py”,第192行,在safestock     m.optimize()   在gurobipy.Model.optimize文件“model.pxi”,第536行(../../src/python/gurobipy.c:37543) GurobiError:Q矩阵不是半正定(PSD)

1 个答案:

答案 0 :(得分:0)

形式Z2 [d] * Z2 [d]的表达式是凸的,但是它在&lt; =约束的右侧。这相当于具有凹左手侧表达式的&lt; =等式,Gurobi不支持。根本问题是你试图最小化表示规模经济的凹面(平方根)。虽然你可以使用代数使平方根消失,但你不能使问题的固有非凸性消失。您可以使用二元变量或内置的分段线性特征来近似平方根。