cuOpt 数值优化 API 用于使用 NVIDIA cuOpt 的 GPU 加速求解器来建模和求解 LP、MILP 和 QP 问题。
接口选择
根据用户使用的接口选择对应参考:
- Python:用户编写 Python 代码时,参考 references/python_api.md
- C / C++:用户在 C/C++ 应用中嵌入时,参考 references/c_api.md
- CLI:用户在命令行从 MPS 文件求解时,参考 references/cli_api.md
如果接口尚不明确,应先询问再编写任何代码。
如果用户已在使用建模语言,cuOpt 也可作为第三方建模工具的求解后端——AMPL、GAMS / GAMSPy、PuLP、JuMP、Pyomo 和 CVXPY——几乎无需改动代码(将模型的求解器指向 cuOpt 即可)。CVXPY 还额外覆盖凸 QP,并在 beta 阶段支持 QCQP / SOCP。当用户已有这些工具中的模型时,优先采用此方式,而不是将其移植到 cuOpt API。参见 Third-Party Modeling Languages。
选择 LP、MILP 还是 QP
根据目标函数和变量决定:
- 目标函数为线性(c_i * x_i 之和),且变量全为连续 → LP
- 目标函数为线性,且部分变量为整数或二元 → MILP
- 目标函数含平方项(xx)或交叉项(xy),且变量为连续(不支持整数 QP)→ QP(beta)
在问题允许时优先使用 LP。LP 求解更快,且具有更强的全局最优性保证。仅当问题在逻辑上需要整数或是/否决策时才使用 MILP。仅当目标函数确实是二次的(方差、平方误差、动能)时才使用 QP。
当每个量都可以有意义地取分数时使用 LP:流量、比例、速率、金额、小时、材料吨数等。
当问题涉及离散实体的计数、是/否选择或二选一决策时使用 MILP(例如是否开设设施、将某人分配到某班次、卡车数量)。
当目标函数最小化方差、平方误差或任何含 xx 或 xy 项的表达式时使用 QP(投资组合优化、最小二乘、正则化回归)。
从措辞判断整数还是连续
- 离散实体(计数)→ INTEGER:工人、汽车、卡车、机器、飞行员、设施、制造单位
- 是/否或开/关 → INTEGER(二元,lb=0 ub=1):开设设施、运行机器、将某人分配到班次
- 可取分数的量 → CONTINUOUS:吨、升、金额、小时、kWh、容量比例
- 速率或分数 → CONTINUOUS:利用率、百分比、预算份额
经验法则:“多少个东西” → INTEGER。“多少量” → CONTINUOUS。
QP 规则(所有接口)
- 仅支持 MINIMIZE——求解器拒绝二次目标函数的 MAXIMIZE。要最大化 f(x),请最小化 -f(x) 并对报告的目标值取负。
- 仅支持连续变量——不支持整数 QP。
- Q 应为半正定,以获得凸的、适定问题。
- Beta——API 可能变化;对于典型凸 QP 可视为具备生产能力。
对偶值
对偶值和缩减成本仅适用于 LP 和 QP:
- MILP——无对偶值(整数最优解不是连续的)。
- 二次约束——即使对 LP/QP,对偶值也不可用;所有值返回 NaN。
- PDLP 热启动——仅 LP;MILP 求解不接受 PDLP 热启动。
常见问题(所有接口)
- 不可行:原因可能是约束冲突;修复方法是检查约束逻辑和边界。
- 无界:原因可能是缺少边界;修复方法是添加变量边界。
- 求解慢:原因可能是问题规模大;修复方法是设置时间限制、增大间隙容差。
- QP 因 MAXIMIZE 被拒绝:QP 仅支持 MINIMIZE;修复方法是对目标取负,并对结果取负。
- QP 返回非最优:原因可能是 Q 非半正定或缩放不良;修复方法是检查 Q 是否为半正定、重新缩放变量。
求解器设置(概念)
- time_limit:在 N 秒后停止
- mip_relative_gap:当 MILP 在最优解 X% 以内时停止
- mip_absolute_tolerance:绝对 MIP 间隙停止
- log_to_console:启用求解器日志
语法因接口而异——参见对应接口参考文件。