python - 如何在优化代码中将约束重新编写为正半定?
问题描述
我目前正在为波音 777x 上的座位布局编写优化算法,但通过 python 使用 gurobi,但为了进行二次优化,我的约束需要是一个正半定矩阵 (Q)。如何将我的简单约束重写为正定或半正定?欢迎任何帮助!
我已经尝试删除和更改约束但没有成功。
# !/usr/bin/python
from gurobipy import *
# Create the model to be used in the terminal
m = Model("777x Optimization")
# Name and Create the variables
x1 = m.addVar(name="First-Class Seat Pitch [in]")
x2 = m.addVar(name="First-Class Seat Width [in]")
x3 = m.addVar(name="First-Class Seat Thickness [in]")
x4 = m.addVar(name="Premium-Economy Seat Pitch [in]")
x5 = m.addVar(name="Premium-Economy Seat Width [in]")
x6 = m.addVar(name="Premium-Economy Seat Thickness [in]")
x7 = m.addVar(name="Number of First-Class Rows")
x8 = m.addVar(name="Number of Premium-Economy Rows")
x9 = m.addVar(name="Number of First-Class Seats Per Row")
x10 = m.addVar(name="Number of Premium-Economy Seats per Row")
# Set objective: f(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10)
obj = x7*(x1+x2+x3) + x8*(x4+x5+x6)
m.setObjective(obj, GRB.MINIMIZE)
# Add constraints
# m.addConstr((x7*x1*x2)+(x4*x5*x8) <= 342625, "Area Constraint")
m.addConstr(-1512*x8*x10 - 5410*x7*x9 <= -202182, "Ticket Revenue Constraint")
m.addConstr(0.25*-x5 + 0.35*-x6 +0.4*-x4 <= -18.6975, "Premium- Economy Comfort Level Constraint")
m.addConstr(0.25*-x2 + 0.35*-x3 +0.4*-x1 <= -29.16, "First-Class Economy Comfort Constraint")
m.addConstr(-x8*x10 + 1.4*x7*x9 <= 0 , "Ratio of First Class to Economy Class Seats Constraint")
m.addConstr(-x1 <= -57, "Minimum First-Class Pitch Constraint")
m.addConstr(-x2 <= -25, "Minimum First-Class Width Constraint")
m.addConstr(-x3 <= -3, "Minimum First-Class Thickness Constraint")
m.addConstr(-x4 <= -36, "Minimum Premium-Economy Pitch Constraint")
m.addConstr(-x5 <= -18.5, "Minimum Premium-Economy Width Constraint")
m.addConstr(-x6 <= -1.5, "Minimum Premium-Economy Thickness Constraint")
m.addConstr(x7*x1 + x8*x4 <= 1470, "Rows Constraint")
m.addConstr(x9*x2 <= 163.128, "Seats Per Row Constraint First-Class")
m.addConstr(x10*x5 <= 163.128, "Seats Per Row Constraint Premium-Economy")
m.optimize()
for v in m.getVars():
print('%s %g' % (v.varName, v.x))
print('Obj: %g' % obj.getValue())
GurobiError: Q matrix is not positive semi-definite (PSD)
Optimize a model with 8 rows, 10 columns and 12 nonzeros
Model has 6 quadratic objective terms
Model has 5 quadratic constraints
Coefficient statistics:
Matrix range [2e-01, 1e+00]
QMatrix range [1e+00, 5e+03]
Objective range [0e+00, 0e+00]
QObjective range [2e+00, 2e+00]
Bounds range [0e+00, 0e+00]
RHS range [2e+00, 6e+01]
QRHS range [2e+02, 2e+05]
Presolve removed 8 rows and 2 columns
解决方案
推荐阅读
- python-sphinx - 是否有将“预计阅读时间”添加到文档页面的扩展程序?
- laravel - 存储文件夹中的图像未在 laravel 中显示
- javascript - 如何在 Firefox 的开发者控制台中禁用自动字符串转义?
- google-api - Dialogflow 获取实体
- timeout - 开始处理 HTTP 请求 POST 后 ASP.NET Core 3.1 错误超时
- android - 如何在无障碍服务中检测返回/主页新闻?
- typescript - 结合接口来生成一个新的类型,并结合它们的属性
- firebase - Firebase 动态链接和托管在同一(自定义)域上
- amazon-web-services - 通过 DynamoDB 建模帖子和主题
- string - 如何在 Haskell 中转换 Integer in String 和 String in Integer?