CONOPT 3 求解器手册

 

目录

1. 引言

本文档适用于 CONOPT 3。在下文中,我们将 CONOPT 3 简称为 CONOPT。请注意,还存在改进版本 CONOPT 4

使用 GAMS 创建的非线性模型必须用非线性规划(NLP)算法来求解。目前有大量不同的求解器可用,而且数量还在增长。

求解器之间最重要的区别在于它们是试图寻找局部解还是全局解。试图寻找全局解的求解器(所谓的全局求解器)通常无法求解非常大的模型。相比之下,大多数局部求解器可以处理大得多的模型,超过 10,000 个变量和约束的模型并不罕见。如果模型具有正确的数学性质(例如是凸的),则局部求解器能够找到全局最优解。遗憾的是,检验一般 NLP 模型是否为凸的数学机制尚未发展成熟(预计属于难题类别)。

几乎不可能预测某个特定模型用某个特定算法求解的难易程度,尤其是对于 NLP 模型,因此 GAMS 无法自动为您选择最佳算法。安装 GAMS 时,您必须选择一种非线性规划算法作为 NLP 模型的默认求解器。如果您想针对特定模型在算法之间切换,可以在 GAMS 源文件中的 Solve 语句之前添加语句 Option NLP = <求解器名称>,也可以在 GAMS 命令行上添加 NLP = <求解器名称>,或重新运行 gamsinst 程序。

确定哪种求解器适用于哪类模型的唯一可靠方法目前仍是试验。不过,有一些经验法则:

  • CONOPT 非常适合具有高度非线性约束的模型。如果您遇到求解器在优化过程中难以保持可行性的情况,应尝试使用 CONOPT。另一方面,如果您的模型在目标函数之外几乎没有非线性,则其他求解器可能是最佳选择。
  • CONOPT 具有快速寻找第一个可行解的方法,特别适用于自由度少的模型。如果您的模型具有大致相同数量的约束和变量,应尝试使用 CONOPT。CONOPT 也可用于求解没有目标函数的方系统方程组,对应于 GAMS 模型类型 CNS(约束非线性系统)。
  • CONOPT 可以使用二阶导数。如果变量数量远多于约束数量,CONOPT 将使用二阶导数,整体进度可能比 MINOS 或 SNOPT 快得多。IPOPT 和 KNITRO 也使用二阶导数,但方法非常不同,无法预测哪种求解器更好。
  • CONOPT 有一个预处理步骤,在此步骤中递归方程和变量被求解并从模型中移除。如果您的模型中有许多方程可以逐个求解,CONOPT 将利用这一特性。类似地,仅用于定义目标项的中间变量将从模型中消除,约束被移入目标函数。
  • CONOPT 具有许多内置测试和消息,许多可以且应该由建模者改进的模型会被拒绝并附带建设性消息。因此,CONOPT 在模型开发过程中也是一个有用的调试工具。最终调试后的模型的最佳求解器可能是或不一定是 CONOPT。
  • CONOPT 是为大型稀疏模型设计的。这意味着变量和方程的数量都可以很大。实际上,已成功求解了超过 100,000 个方程和变量的 NLP 模型,以及超过 1,000,000 个方程和变量的 CNS 模型。构建 CONOPT 所用的组件是在模型稀疏的假设下选择的,即大多数函数只依赖于少量变量。CONOPT 也可用于更稠密的模型,但性能将显著下降。
  • CONOPT 是为具有光滑函数的模型设计的,但也可应用于不具有可微函数的模型(在 GAMS 中称为 DNLP 模型)。然而,CONOPT 将使用与真实 NLP 模型相同的算法,它将搜索满足标准一阶最优性条件的点,而不考虑模型的部分可能是不光滑或不可微的。光滑性的缺乏可能会混淆 CONOPT 中的算法,导致收敛缓慢,而且满足标准一阶最优性条件的点可能根本不存在。因此,对此类模型没有任何保证。如果 CONOPT 以局部最优解终止,则该解确实将是局部最优的。然而,有时您会得到诸如"收敛太慢"或"尽管简化梯度大于容差但目标函数没有变化"之类的终止消息,表明终止不成功。最终点可能是也可能不是局部最优的。如果可能,您应尝试将 DNLP 模型重新表述为等价或近似等价的形式,如 NLP 和 DNLP 模型部分所述。

大多数建模者不应关注算法细节,例如算法子组件或容差的选择。CONOPT 具有相当多的内置逻辑,可以选择看似最适合当前模型类型的求解方法,并且随着关于模型行为的信息的收集和更新,该方法会动态调整。CONOPT 算法的描述已移至附录 A,大多数建模者可以跳过。但是,如果您遇到困难,可能需要参考附录 A 以了解一些更具体的信息。

2. 终止消息

当 CONOPT 完成时,它将显示一条终止消息,说明完成的原因。本节将显示大部分这些消息,并附带简短说明。它还将显示返回给 GAMS 的模型状态(存放在 <model>.ModelStat 中,其中 <model> 是 GAMS 模型的名称)。求解器状态(存放在 <model>.SolveStat 中)如果不同于 1(正常完成),也将给出。

以下消息用于最优解,CONOPT 将返回 ModelStat = 2(局部最优),除非另有说明:

    ** 最优解。没有超基本变量。

该解是局部最优的角点解。解仅由约束决定,变量值和目标函数值通常都非常精确。在某些情况下,CONOPT 可以确定该解是全局最优的,并将返回 ModelStat = 1(最优)。

    ** 最优解。简化梯度小于容差。

该解是局部最优的内部解。简化梯度的最大分量小于最优性容差 RTREDG(默认值 1.e-7)。

    ** 最优解。基于简化梯度和估计 Hessian 矩阵的
             最优目标函数值估计误差小于目标函数的最小容差。

该解是局部最优的内部解。简化梯度的最大分量大于最优性容差 RTREDG,但当用二阶信息缩放时,解看起来是最优的。

    ** 最优解。收敛速度太慢。目标函数的变化已连续
             xx 次迭代小于 xx.xx。

CONOPT 以一个看似最优的解停止。由于进度缓慢,求解过程停止。模型必须有大的导数,因此建议对其进行缩放。

以上四条消息都存在"最优"被替换为"不可行"的版本,此时 ModelStat 为 5(局部不可行)或 4(不可行)。

    ** 可行解。收敛速度太慢。目标函数的变化已连续
             xx 次迭代小于 xx.xx。
    ** 可行解。容差已最小且目标函数没有变化,
             尽管简化梯度大于容差。

这些消息表明 CONOPT 以一个可行解停止,但最优性准则尚未满足,伴随 ModelStat = 7(可行解)和 SolveStat = 4(由求解器终止)。

    ** 无界解。变量已达到'无穷大'。
              最大合法值 (LMMXVR) 为 xx.xx

如果变量超过 LMMXVR 的值(默认 1.e15),CONOPT 认为解是无界的,返回 ModelStat = 3(无界)。

    ** 已达到时间限制。

已达到 GAMS 中定义的时间限制。CONOPT 返回 SolveStat = 3(资源中断)。

    ** 已达到迭代限制。

已达到 GAMS 中定义的迭代限制。CONOPT 返回 SolveStat = 2(迭代中断)。

    ** 非线性函数中的域错误。

函数评估错误的数量已达到 GAMS 中通过 Option DomLim = xx; 定义的域限制。CONOPT 返回 SolveStat = 5(评估错误限制)。

    ** 初始导数太大(大于 Rtmaxj= xx.xx)。
              缩放变量和/或方程,或添加边界。

          ** 导数太大(大于 Rtmaxj= xx.xx)。
              缩放变量和/或方程,或添加边界。

如果导数或雅可比元素非常大,会出现这些消息。如果违规导数与 Log(x)1/x 项相关,尝试增加 x 的下界。如果与 Exp(x) 项相关,必须减小 x 的上界。也可以尝试缩放模型。

    ** 前三角部分中的方程无法求解,
              因为临界变量在边界上。

          ** 前三角部分中的方程无法求解,
              因为主元太小。

          ** 方程与前三角部分中的其他方程不一致。

这些包含"前三角"的消息都与 CONOPT 预处理阶段识别出的不可行性有关。

    ** 致命错误 ** 内存不足,无法继续优化。
              必须请求更多内存。

如果 GAMS 提供的统计信息不足以估计所需内存,可能会出现此消息。您可以使用 <model>.WorkFactor = x.x;<model>.WorkSpace = xx; 请求更多内存。

3. 迭代日志

运行 CONOPT 时,您会看到类似以下的日志文件:

 CONOPT 3         52.2.0 d8e408be Dec 8, 2025           WEI x86 64bit/MS Window

          C O N O P T   version 3.38.2
          Copyright (C) GAMS Software GmbH
                        GAMS Development Corporation

          Iter Phase   Ninf   Infeasibility   RGmax      NSB   Step  InItr MX OK
             0   0          1.1198119428E+02 (Input point)

          Iter Phase   Ninf   Infeasibility   RGmax      NSB   Step  InItr MX OK
             1   0          1.9323934856E-01                 1.0E+00     1 T  T
          ...

第一列是迭代编号。Phase 列显示迭代类型(0=类牛顿,1/2=可行/不可行 SLP,3/4=可行/不可行 SQP)。Infeasibility/Objective 列显示当前不可行性总和或目标函数值。RGmax 是最大简化梯度,NSB 是超基本变量数量,Step 是步长,InItr 是内部迭代次数,MX 和 OK 表示一维搜索的状态。

4. 预处理器

CONOPT 的预处理器通过识别和移除前三角和后三角变量和约束来简化模型。固定变量被完全移除。简单不等式被转化为边界。定义性约束(形如 x =E= f(y))被识别并逻辑消除。

预处理器的输出显示在日志文件中,说明用户模型与内部模型的大小对比。可以使用选项 LKPRP = false 关闭预处理器。

5. 缩放

良好的缩放对任何 NLP 算法都很重要。CONOPT 有几种缩放方法,由选项 MTSCAL 控制。默认方法使用来自 GAMS 的导数信息为每个变量和方程计算缩放因子。缩放因子被投影到区间 [RTSCMN, RTSCMX] 上以避免极端值。

6. 算法(附录 A)

CONOPT 中使用的算法基于 Abadie 和 Carpentier(1969 年)首次提出的 GRG(广义简化梯度)算法。主要步骤如下:

  1. 初始化并找到可行解。
  2. 计算约束的雅可比矩阵 J。
  3. 选择一组基本变量 xb,使得 B(J 的基本列子矩阵)非奇异。对 B 进行因式分解。
  4. 求解 B^T u = df/dxb 得到乘子 u。
  5. 计算简化梯度 rgra = df/dx - J^T u。
  6. 如果投影到边界上的 rgra 很小,则停止。
  7. 选择超基本变量并基于 rgra 和可能的二阶信息找到搜索方向。
  8. 执行线搜索,调整基本变量以满足约束。
  9. 转到步骤 2。

实际实现包含许多修改以提高对大型模型的效率。更多技术细节请参阅原始 CONOPT 文档和本文末尾的参考文献。

7. 选项

本节描述了 CONOPT 3 可用的选项。每个选项都有默认值,大多数用户不需要更改。

7.1 算法选项

选项描述默认值
FCSALL函数评估次数的限制0
ITLIM迭代次数限制GAMS IterLim
LFCSAL函数评估次数的软限制20000
LIOLD基老化限制15
LISOWP缓慢进展限制10
LKADJX调整初始点过程中的标志2
LKCCLP在使用 SLP 之前需要满足的连续二次迭代次数10
LKCCQP在使用 SQP 之前需要满足的连续二次迭代次数5
LKDEBG调试一阶导数的标志2
LKFAST在 SLP 模式中使用快速方法1
LKHESS使用二阶导数的标志2
LKLIND在 SLP 方法中使用 LP 定价的标志0
LKLTWO在 SLP 方法中使用两种定价方法的标志1
LKMODECONOPT 的操作模式0
LKMSGL消息级别2
LKNOPN不使用无惩罚模型的标志0
LKPERM在预处理后使用永久基的标志1
LKPIVC主元列检查的标志1
LKPIVR主元行检查的标志1
LKPRP使用预处理器的标志1
LKREDC简化成本的标志1
LKSSTASQP 模式中稳态测试的标志0
LKSTAL停滞预防的标志2
LKTRIE前三角方程求解失败时的标志1
LMMXVR变量的最大绝对值1.e15
LMSOWP在停滞前要满足的缓慢进展限制20
MTSCAL缩放方法3
MXFSAL函数评估的最大次数500000
MXITER最大迭代次数100000
MXSCTR缩放过程中最大扫描次数10
MXSTAGE预处理阶段的最大次数100
PRPREC预处理器更改变量的打印100
RTBOX信任区域框的初始大小1.e6
RTDEGN退化容差1.e-8
RTEOBJ目标函数相对精度3.e-13
RTFEAS可行性容差1.e-7
RTFEAX最大可行性容差1.e-7
RTFMIN最小可行性容差4.e-10
RTFTRM三角方程的可行性容差1.e-8
RTMAXJ最大允许雅可比元素1.e12
RTOBCH目标函数变化容差7.e-13
RTPIV绝对主元容差0
RTPIVU基更新期间的相对主元容差0.05
RTREDG简化梯度的最优性容差1.e-7
RTSCMN缩放因子下界1
RTSCMX缩放下界1.e20
RTVFILL基分解的填充因子5
RVHESSHessian 的存储因子10
RVTIME时间限制GAMS ResLim
RTZERN外部方程中的零噪声容差0.0

7.2 调试选项

选项描述默认值
LKDEBG一阶导数调试级别2
LKMSGL消息详细级别2

7.3 输出选项

选项描述默认值
PRPREC打印预处理器更改的变量100

7.4 接口选项

选项描述默认值
LKHESS使用二阶导数的标志2
LKMODE操作模式0
RTVFILL基分解的填充因子5
RVHESSHessian 存储因子10
RVTIME时间限制GAMS ResLim

7.5 详细选项说明

FCSALL (整数): 函数评估次数的外部限制。
默认: 0(使用 GAMS DomLim)

ITLIM (整数): 迭代次数的外部限制。覆盖 GAMS IterLim。
范围: [0, 1000000000]

LFCSAL (整数): 函数评估次数的软限制。
范围: [100, 10000000] | 默认: 20000

LIOLD (整数): 基老化限制。如果基在 LIOLD 次迭代内没有变化,则触发重新分解。
范围: [1, 100] | 默认: 15

LISOWP (整数): 缓慢进展限制。如果连续 LISOWP 次迭代进展缓慢,则终止。
范围: [3, 100] | 默认: 10

LKADJX (整数): 调整初始点过程。0=关闭,1=在阶段 0 前执行,2=在阶段 0 前和阶段 0 中执行。
范围: [0, 2] | 默认: 2

LKCCLP (整数): 使用 SLP 前所需连续迭代次数。
范围: [1, 100] | 默认: 10

LKCCQP (整数): 使用 SQP 前所需连续迭代次数。
范围: [1, 100] | 默认: 5

LKDEBG (整数): 一阶导数调试级别。0=无调试,1=仅初始点,2=初始点和有问题时。
范围: [0, 2] | 默认: 2

LKFAST (整数): 在 SLP 模式下使用快速方法的标志。
范围: [0, 1] | 默认: 1

LKHESS (整数): 使用二阶导数的标志。0=从不,1=转换到 SQP 后,2=自动。
范围: [0, 2] | 默认: 2

LKLIND (整数): 在 SLP 方法中使用 LP 定价的标志。
范围: [0, 1] | 默认: 0

LKLTWO (整数): 在 SLP 方法中使用两种定价方法的标志。
范围: [0, 1] | 默认: 1

LKMODE (整数): CONOPT 的操作模式。0=自动,1=只使用 SLP,2=只使用 SQP,3=使用 CNS 模式。
范围: [0, 3] | 默认: 0

LKMSGL (整数): 消息级别。0=仅致命错误,1=错误,2=警告,3=信息,4=详细。
范围: [0, 4] | 默认: 2

LKNOPN (整数): 不使用无惩罚模型的标志。0=使用,1=不使用。
范围: [0, 1] | 默认: 0

LKPERM (整数): 在预处理后使用永久基的标志。
范围: [0, 1] | 默认: 1

LKPIVC (整数): 主元列检查的标志。
范围: [0, 1] | 默认: 1

LKPIVR (整数): 主元行检查的标志。
范围: [0, 1] | 默认: 1

LKPRP (整数): 使用预处理器的标志。0=不使用,1=使用。
范围: [0, 1] | 默认: 1

LKREDC (整数): 简化成本的标志。
范围: [0, 1] | 默认: 1

LKSSTA (整数): SQP 模式中稳态测试的标志。
范围: [0, 1] | 默认: 0

LKSTAL (整数): 停滞预防的标志。0=关闭,1=标准,2=激进。
范围: [0, 2] | 默认: 2

LKTRIE (整数): 前三角方程求解失败时的标志。0=停止,1=跳过并继续。
范围: [0, 1] | 默认: 1

LMMXVR (实数): 变量的最大绝对值。超过此值的变量触发无界消息。
范围: [1.e2, 1.e20] | 默认: 1.e15

LMSOWP (整数): 停滞前要满足的缓慢进展限制。
范围: [10, 1000] | 默认: 20

MTSCAL (整数): 缩放方法。0=无缩放,1=简单迭代,2=基于线性部分,3=自动选择。
范围: [0, 3] | 默认: 3

MXFSAL (整数): 函数评估的最大次数。
范围: [1000, 10000000] | 默认: 500000

MXITER (整数): 最大迭代次数。
范围: [100, 10000000] | 默认: 100000

MXSCTR (整数): 缩放过程中最大扫描次数。
范围: [1, 100] | 默认: 10

MXSTAGE (整数): 预处理阶段的最大次数。
范围: [1, 1000] | 默认: 100

PRPREC (整数): 预处理器更改变量的打印。0=不打印,N=打印前 N 个。
范围: [0, 10000] | 默认: 100

RTBOX (实数): 信任区域框的初始大小。
范围: [1.e-4, 1.e12] | 默认: 1.e6

RTDEGN (实数): 退化容差。用于检测退化约束。
范围: [3.e-13, 1.e-4] | 默认: 1.e-8

RTEOBJ (实数): 目标函数的相对精度。假设目标函数可以计算到 RTEOBJ * max(1,|Obj|) 的精度。
范围: [3.e-14, 1.e-6] | 默认: 3.e-13

RTFEAS (实数): 可行性容差。约束残差小于此值被视为可行。
范围: [3.e-13, 1.e-4] | 默认: 1.e-7

RTFEAX (实数): 最大可行性容差。
范围: [3.e-13, 1.e-4] | 默认: 1.e-7

RTFMIN (实数): 最小可行性容差。收紧容差时的目标值。
范围: [3.e-13, 1.e-8] | 默认: 4.e-10

RTFTRM (实数): 三角方程的可行性容差。
范围: [3.e-13, 1.e-4] | 默认: 1.e-8

RTMAXJ (实数): 最大允许雅可比元素。如果任何|J|元素大于此值,CONOPT 将停止。
范围: [1.e4, 1.e15] | 默认: 1.e12

RTOBCH (实数): 目标函数变化容差。如果目标变化小于 RTOBCH * max(1,|Obj|),迭代被视为缓慢进展。
范围: [3.e-14, 1.e-6] | 默认: 7.e-13

RTPIV (实数): 绝对主元容差。0 表示自动选择。
范围: [0, 1.e-4] | 默认: 0

RTPIVU (实数): 基更新期间的相对主元容差。较小的值允许更稀疏的基更新但可能导致数值误差累积。
范围: [1.e-3, 0.9] | 默认: 0.05

RTREDG (实数): 简化梯度的最优性容差。简化梯度的最大超基本分量小于此值时解被认为最优。
范围: [3.e-13, 1] | 默认: 1.e-7

RTPREC (实数): 预处理器变量更改的打印容差。只打印变化超过 deltaX > RTPREC * max(1,|X|) 的变量。
范围: [0, ∞] | 默认: 0.0

RTPREL (实数): 预处理器中定义大量变量更改的容差。deltaX > RTPREL * max(1,|X|) 被视为大变化。
范围: [0, ∞] | 默认: 0.01

RTSCMN (实数): 缩放因子下界。缩放因子被投影到此值以上。1 表示不放大小的值。
范围: [1.e-10, 1] | 默认: 1

RTSCMX (实数): 缩放因子上界。缩放因子被投影到此值以下。
范围: [1, 1.e30] | 默认: 1.e20

RVFILL (实数): 基分解的填充因子。假设填充为 Rvfill-1 倍基中初始非零元素数。
范围: [1.00, 20] | 默认: 5

RVHESS (实数): Hessian 的存储因子。如果 Hessian 中非零元素数 > 非线性雅可比元素数 * Rvhess,则跳过 Hessian。0 表示无限制。
默认: 10

RVTIME (实数): 时间限制(秒)。覆盖 GAMS Reslim 选项。
默认: GAMS ResLim

RTZERN (实数): 外部方程中的零噪声容差。用于避免外部函数常量导数的假阳性调试消息。
范围: [0, 1] | 默认: 0.0

8. 附录 C — 参考文献

  1. J. Abadie 和 J. Carpentier, Generalization of the Wolfe Reduced Gradient Method to the case of Nonlinear Constraints, 载于 Optimization, R. Fletcher (ed.), Academic Press, New York, 37–47 (1969).
  2. A. Drud, A GRG Code for Large Sparse Dynamic Nonlinear Optimization Problems, Mathematical Programming 31, 153–191 (1985).
  3. A. S. Drud, CONOPT – A Large-Scale GRG Code, ORSA Journal on Computing 6, 207–216 (1992).
  4. A. S. Drud, CONOPT: A System for Large Scale Nonlinear Optimization, Tutorial for CONOPT Subroutine Library, 16p, ARKI Consulting and Development A/S, Bagsvaerd, Denmark (1995).
  5. A. S. Drud, CONOPT: A System for Large Scale Nonlinear Optimization, Reference Manual for CONOPT Subroutine Library, 69p, ARKI Consulting and Development A/S, Bagsvaerd, Denmark (1996).
  6. J. K. Reid, A Sparsity Exploiting Variant of Bartels-Golub Decomposition for Linear Programming Bases, Mathematical Programming 24, 55–69 (1982).
  7. D. M. Ryan 和 M. R. Osborne, On the Solution of Highly Degenerate Linear Programmes, Mathematical Programming 41, 385–392 (1988).
  8. U. H. Suhl 和 L. M. Suhl, Computing Sparse LU Factorizations for Large-Scale Linear Programming Bases, ORSA Journal on Computing 2, 325–335 (1990).

 

 


 

在线留言

尊敬的客户朋友,如您有任何意见建议,请通过下表反馈给我们,我们会尽快与您联系。

 

 

 

 

联系我们

 

微信公众号

咨询微信

企业店铺

400-621-1085

(节假日期间办公室座机如无人接听,请选择其他联系方式,感谢理解!祝您节日快乐!)

 

联系我们 快速链接 相关产品 上海卡贝信息技术有限公司

©2025  上海卡贝信息技术有限公司

产品中心

下载中心

站点地图

隐私政策

 

销售QQ咨询

产品QQ咨询

淘宝店铺

 

GAMS:概述

最近更新

相关文档

下载试用

购买咨询

Berkeley Madonna

iThink

Stella Architect

IBM SPSS Modeler

DecisionTools Suite

NeuralTools

Frontier Analyst

Vensim

RISKOptimizer

PrecisionTree

LINGO

LINDO API

What'sBest!

@RISK

BARON

BayesiaLab

Oracle Crystal Ball

GEMPACK

GTAP Database

TreeAge