python - Gurobi错误: Q matrix is not positive semi-definite (PSD)

标签 python matrix model psd gurobi

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

因为 Gurobi 不支持平方根,所以我将目标函数转换如下: Σ(hza*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 行,位于 安全库存(需求、中间、阿尔法) 文件“C:\gurobi600\win32\examples\python\safetyStock.py”,第 192 行,位于 safetystock 中 m.optimize() 文件“model.pxi”,第 536 行,位于 gurobipy.Model.optimize (../../src/python/gurobipy.c:37543) GurobiError:Q 矩阵不是正半定 (PSD)

最佳答案

Z2[d]*Z2[d] 形式的表达式是凸的,但它位于 <= 约束的右侧。这相当于带有凹左侧表达式的 <= 方程,但 Gurobi 不支持该表达式。根本问题是您试图最小化代表规模经济的凹表达式(平方根)。虽然您可以使用代数消除平方根,但您无法消除问题固有的非凸性。您可以使用二元变量或内置的分段线性特征来近似平方根。

关于python - Gurobi错误: Q matrix is not positive semi-definite (PSD),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31916185/

相关文章:

c++ - 如何在 DirectX11 中围绕其局部轴之一旋转对象

ember.js - Ember : Access sideloaded model relationship data in template

tensorflow - 如何使用 tf.saved_model 加载模型并调用预测函数 [TENSORFLOW 2.0 API]

python - 在什么情况下 Tkinter 的 grid() 不能与 pack() 混合?

python - 插入字节类型的对象

c++ - 被 C++ 中的矩阵难住了

matlab - matlab中的writematrix命令可以指定小数位数吗?

python - 为什么 Azure ML 笔记本和 Azure ML 终端中的 env 不同?

python - 如何根据Python中其他列的条件将字符串列拆分为另一列?

ruby-on-rails - Rails 3.2.8,只有重启服务器才会取消缓存模型