ILP求解器——Gurobi
Gurobi
下载
首先前往官网: https://www.gurobi.com/academia/academic-program-and-licenses/
我选的是 Academic-WSL-License,因为我想在任意环境(包括容器里)共享使用一个许可证。所以进入: https://www.gurobi.com/features/academic-wls-license/ 。按照官方说明:
To obtain your free Academic WLS License:
- Register for a free Gurobi account as an academic.
- From any computer connected to a recognized academic institution network, log in to the Gurobi User Portal.
- Request your Academic WLS License. Once generated, your WLS license can be used from computers outside the academic network.
Note: Your WLS license will be valid for 90 days and is renewable for as long as you maintain eligibility.
注册时需要输入邮箱、名字、国家(记得使用学校邮箱),然后会让你输入具体学校和毕业时间
注册完毕后直接访问: https://portal.gurobi.com/iam/licenses/request/?type=academic 即可。
点击第一个就行
注意此时可能会有一个错误:<your-ip> host 'undefined' is not recognized as belonging to an academic domain"
此时就需要从校园网去访问!(同时关闭你的代理)
成功之后会有:
然后去 https://www.gurobi.com/downloads/gurobi-software/ 下载就行。
安装好后,在终端需要一些操作(建议生成 Named-User Academic 便捷一点):
grbgetkey <your-key>
然后使用:gurobi_cl
就行了。
使用
Gurobi 支持多种格式:LP、MPS、QCP、REW、GAMPS 等。
- LP(
.lp
)- 描述:可读性最强的文本格式,以代数式(equation)方式展现目标与约束。
- 优缺点:易于人工检查和调试,但导出时不保证列顺序,也可能丢失部分小数精度,不适合高频读写docs.gurobi.comsupport.gurobi.com。
- MPS(
.mps
)- 描述:业界标准的定宽文本格式,最广泛的模型交换格式。
- 优缺点:保留完整数值精度和列/行顺序,兼容几乎所有求解器。Gurobi 推荐在生产环境和跨平台/跨工具交换时使用docs.gurobi.com。
- REW(
.rew
)- 描述:与 MPS 完全相同,但在写文件时会匿名化变量和约束名称(重命名为
C1, C2…
/X1(…)
等)。 - 优缺点:适合在不想泄露模型内部命名或敏感信息时共享;因匿名化而稍微降低可读性,但结构与性能与 MPS 一致docs.gurobi.com。
- 描述:与 MPS 完全相同,但在写文件时会匿名化变量和约束名称(重命名为
- QCP(
.qcp
)- 描述:在 MPS 基础上,扩展支持凸二次目标和二次/锥约束(Second-Order Cone Constraints)。
- 优缺点:当你的模型含有二次项或 SOC 约束时,使用 QCP 格式能更直接地保存这些结构,避免在 LP/MPS 中转换失真docs.gurobi.com。
- GAMPS
- 描述:不是 Gurobi 原生独立格式,而是由 GAMS/AMPL 等建模环境通过“WriteProb”导出的 MPS/LP 变体,Gurobi 在后台仍按 MPS(或 LP)解析。
- 优缺点:仅在 GAMS 工作流中出现;本质上与标准 MPS/LP 无异,额外价值在于与 GAMS 接口的无缝衔接。
例子
from gurobipy import Model, GRB
# 1. 新建模型
m = Model("toy_example")
# 2. 添加变量
x = m.addVar(lb=0, name="x")
y = m.addVar(lb=0, name="y")
# 3. 添加约束
m.addConstr(2*x + y <= 20, name="c1")
m.addConstr( x + 3*y <= 30, name="c2")
# 4. 设置目标
m.setObjective(x + y, GRB.MAXIMIZE)
# 5. 优化
m.optimize()
# 6. 输出结果
if m.status == GRB.OPTIMAL:
print(f"Optimal obj = {m.objVal:.2f}")
print(f"x = {x.x:.2f}, y = {y.x:.2f}")
编译求解即可。
评论