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:

  1. Register for a free Gurobi account as an academic.
  2. From any computer connected to a recognized academic institution network, log in to the Gurobi User Portal.
  3. 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 即可。
⑧工具/学术/优化器——Gurobi/image.webp

点击第一个就行

注意此时可能会有一个错误:<your-ip> host 'undefined' is not recognized as belonging to an academic domain"
此时就需要从校园网去访问!(同时关闭你的代理)
成功之后会有:
⑧工具/学术/优化器——Gurobi/image 1.webp
然后去 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
  • 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}")

编译求解即可。