SuperAPI AI 工具集

cuopt-numerical-optimization-api

数据与分析

查看项目

更新于 10-15 14:00

技能介绍

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:启用求解器日志

语法因接口而异——参见对应接口参考文件。