|
|
CONOPT 3 求解器手册
目录1. 引言本文档适用于 CONOPT 3。在下文中,我们将 CONOPT 3 简称为 CONOPT。请注意,还存在改进版本 CONOPT 4。 使用 GAMS 创建的非线性模型必须用非线性规划(NLP)算法来求解。目前有大量不同的求解器可用,而且数量还在增长。 求解器之间最重要的区别在于它们是试图寻找局部解还是全局解。试图寻找全局解的求解器(所谓的全局求解器)通常无法求解非常大的模型。相比之下,大多数局部求解器可以处理大得多的模型,超过 10,000 个变量和约束的模型并不罕见。如果模型具有正确的数学性质(例如是凸的),则局部求解器能够找到全局最优解。遗憾的是,检验一般 NLP 模型是否为凸的数学机制尚未发展成熟(预计属于难题类别)。 几乎不可能预测某个特定模型用某个特定算法求解的难易程度,尤其是对于 NLP 模型,因此 GAMS 无法自动为您选择最佳算法。安装 GAMS 时,您必须选择一种非线性规划算法作为 NLP 模型的默认求解器。如果您想针对特定模型在算法之间切换,可以在 GAMS 源文件中的 Solve 语句之前添加语句 确定哪种求解器适用于哪类模型的唯一可靠方法目前仍是试验。不过,有一些经验法则:
大多数建模者不应关注算法细节,例如算法子组件或容差的选择。CONOPT 具有相当多的内置逻辑,可以选择看似最适合当前模型类型的求解方法,并且随着关于模型行为的信息的收集和更新,该方法会动态调整。CONOPT 算法的描述已移至附录 A,大多数建模者可以跳过。但是,如果您遇到困难,可能需要参考附录 A 以了解一些更具体的信息。 2. 终止消息当 CONOPT 完成时,它将显示一条终止消息,说明完成的原因。本节将显示大部分这些消息,并附带简短说明。它还将显示返回给 GAMS 的模型状态(存放在 以下消息用于最优解,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 中通过 ** 初始导数太大(大于 Rtmaxj= xx.xx)。
缩放变量和/或方程,或添加边界。
** 导数太大(大于 Rtmaxj= xx.xx)。
缩放变量和/或方程,或添加边界。
如果导数或雅可比元素非常大,会出现这些消息。如果违规导数与 ** 前三角部分中的方程无法求解,
因为临界变量在边界上。
** 前三角部分中的方程无法求解,
因为主元太小。
** 方程与前三角部分中的其他方程不一致。
这些包含"前三角"的消息都与 CONOPT 预处理阶段识别出的不可行性有关。 ** 致命错误 ** 内存不足,无法继续优化。
必须请求更多内存。
如果 GAMS 提供的统计信息不足以估计所需内存,可能会出现此消息。您可以使用 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 的预处理器通过识别和移除前三角和后三角变量和约束来简化模型。固定变量被完全移除。简单不等式被转化为边界。定义性约束(形如 预处理器的输出显示在日志文件中,说明用户模型与内部模型的大小对比。可以使用选项 LKPRP = false 关闭预处理器。 5. 缩放良好的缩放对任何 NLP 算法都很重要。CONOPT 有几种缩放方法,由选项 MTSCAL 控制。默认方法使用来自 GAMS 的导数信息为每个变量和方程计算缩放因子。缩放因子被投影到区间 [RTSCMN, RTSCMX] 上以避免极端值。 6. 算法(附录 A)CONOPT 中使用的算法基于 Abadie 和 Carpentier(1969 年)首次提出的 GRG(广义简化梯度)算法。主要步骤如下:
实际实现包含许多修改以提高对大型模型的效率。更多技术细节请参阅原始 CONOPT 文档和本文末尾的参考文献。 7. 选项本节描述了 CONOPT 3 可用的选项。每个选项都有默认值,大多数用户不需要更改。 7.1 算法选项
7.2 调试选项
7.3 输出选项
7.4 接口选项
7.5 详细选项说明FCSALL (整数): 函数评估次数的外部限制。 ITLIM (整数): 迭代次数的外部限制。覆盖 GAMS IterLim。 LFCSAL (整数): 函数评估次数的软限制。 LIOLD (整数): 基老化限制。如果基在 LIOLD 次迭代内没有变化,则触发重新分解。 LISOWP (整数): 缓慢进展限制。如果连续 LISOWP 次迭代进展缓慢,则终止。 LKADJX (整数): 调整初始点过程。0=关闭,1=在阶段 0 前执行,2=在阶段 0 前和阶段 0 中执行。 LKCCLP (整数): 使用 SLP 前所需连续迭代次数。 LKCCQP (整数): 使用 SQP 前所需连续迭代次数。 LKDEBG (整数): 一阶导数调试级别。0=无调试,1=仅初始点,2=初始点和有问题时。 LKFAST (整数): 在 SLP 模式下使用快速方法的标志。 LKHESS (整数): 使用二阶导数的标志。0=从不,1=转换到 SQP 后,2=自动。 LKLIND (整数): 在 SLP 方法中使用 LP 定价的标志。 LKLTWO (整数): 在 SLP 方法中使用两种定价方法的标志。 LKMODE (整数): CONOPT 的操作模式。0=自动,1=只使用 SLP,2=只使用 SQP,3=使用 CNS 模式。 LKMSGL (整数): 消息级别。0=仅致命错误,1=错误,2=警告,3=信息,4=详细。 LKNOPN (整数): 不使用无惩罚模型的标志。0=使用,1=不使用。 LKPERM (整数): 在预处理后使用永久基的标志。 LKPIVC (整数): 主元列检查的标志。 LKPIVR (整数): 主元行检查的标志。 LKPRP (整数): 使用预处理器的标志。0=不使用,1=使用。 LKREDC (整数): 简化成本的标志。 LKSSTA (整数): SQP 模式中稳态测试的标志。 LKSTAL (整数): 停滞预防的标志。0=关闭,1=标准,2=激进。 LKTRIE (整数): 前三角方程求解失败时的标志。0=停止,1=跳过并继续。 LMMXVR (实数): 变量的最大绝对值。超过此值的变量触发无界消息。 LMSOWP (整数): 停滞前要满足的缓慢进展限制。 MTSCAL (整数): 缩放方法。0=无缩放,1=简单迭代,2=基于线性部分,3=自动选择。 MXFSAL (整数): 函数评估的最大次数。 MXITER (整数): 最大迭代次数。 MXSCTR (整数): 缩放过程中最大扫描次数。 MXSTAGE (整数): 预处理阶段的最大次数。 PRPREC (整数): 预处理器更改变量的打印。0=不打印,N=打印前 N 个。 RTBOX (实数): 信任区域框的初始大小。 RTDEGN (实数): 退化容差。用于检测退化约束。 RTEOBJ (实数): 目标函数的相对精度。假设目标函数可以计算到 RTEOBJ * max(1,|Obj|) 的精度。 RTFEAS (实数): 可行性容差。约束残差小于此值被视为可行。 RTFEAX (实数): 最大可行性容差。 RTFMIN (实数): 最小可行性容差。收紧容差时的目标值。 RTFTRM (实数): 三角方程的可行性容差。 RTMAXJ (实数): 最大允许雅可比元素。如果任何|J|元素大于此值,CONOPT 将停止。 RTOBCH (实数): 目标函数变化容差。如果目标变化小于 RTOBCH * max(1,|Obj|),迭代被视为缓慢进展。 RTPIV (实数): 绝对主元容差。0 表示自动选择。 RTPIVU (实数): 基更新期间的相对主元容差。较小的值允许更稀疏的基更新但可能导致数值误差累积。 RTREDG (实数): 简化梯度的最优性容差。简化梯度的最大超基本分量小于此值时解被认为最优。 RTPREC (实数): 预处理器变量更改的打印容差。只打印变化超过 deltaX > RTPREC * max(1,|X|) 的变量。 RTPREL (实数): 预处理器中定义大量变量更改的容差。deltaX > RTPREL * max(1,|X|) 被视为大变化。 RTSCMN (实数): 缩放因子下界。缩放因子被投影到此值以上。1 表示不放大小的值。 RTSCMX (实数): 缩放因子上界。缩放因子被投影到此值以下。 RVFILL (实数): 基分解的填充因子。假设填充为 Rvfill-1 倍基中初始非零元素数。 RVHESS (实数): Hessian 的存储因子。如果 Hessian 中非零元素数 > 非线性雅可比元素数 * Rvhess,则跳过 Hessian。0 表示无限制。 RVTIME (实数): 时间限制(秒)。覆盖 GAMS Reslim 选项。 RTZERN (实数): 外部方程中的零噪声容差。用于避免外部函数常量导数的假阳性调试消息。 8. 附录 C — 参考文献
在线留言尊敬的客户朋友,如您有任何意见建议,请通过下表反馈给我们,我们会尽快与您联系。
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||