KNITRO 求解器


KNITRO 是 Artelys 公司开发的一款高性能非线性规划(NLP)求解器,广泛应用于科学计算、工程设计、经济建模和运筹优化等领域。作为 GAMS 生态系统中的核心求解器之一,KNITRO 提供了业界领先的非线性优化能力,支持内点法(Interior Point / Barrier)、活性集法(Active Set / SQP)以及多重起点(Multi-start)全局搜索策略等多种算法,可高效处理从中小规模到包含数万个变量和约束的大规模优化问题。

目录


1. 引言(Introduction)

KNITRO 是一款用于求解大规模非线性优化问题的高性能软件包。它提供了三种不同的算法实现:内点法(Interior Point / Barrier)、活性集法(Active Set / SQP)以及内点法与活性集法的混合策略。KNITRO 可以求解以下类型的问题:无约束优化、带边界约束的优化、线性约束优化、一般非线性约束优化(NLP),以及带互补性约束的数学规划(MPCC)。KNITRO 采用先进的稀疏矩阵技术处理大规模问题,并内置自动微分功能计算一阶和二阶导数。求解器在数值稳定性方面表现优异,尤其在病态和高度非线性的问题上具有出色的鲁棒性。KNITRO 还提供了多重起点(Multi-start)全局优化能力,帮助用户寻找非线性问题的全局最优解。此外,KNITRO 支持 MPS(数学规划系统)和补模型格式的输入,并能自动检测问题的凸性以选择最合适的求解策略。

2. 用法(Usage)

在 GAMS 中调用 KNITRO 求解器非常简单。用户可以通过 GAMS 的 option 语句将 KNITRO 设置为 NLP 问题的默认求解器:

option nlp = knitro;

也可以在 solve 语句中直接指定:

solve mymodel using nlp minimizing cost;

KNITRO 支持 GAMS 中所有非线性问题类型,包括 NLP(非线性规划)、DNLP(带导数的非线性规划)、RMINLP(松弛混合整数非线性规划)以及 MPEC(带平衡约束的数学规划)。对于 QCP(二次约束规划)和 MIQCP(混合整数二次约束规划)问题,KNITRO 同样适用。用户可以通过 GAMS 的 model 属性控制求解器的具体行为,例如设置迭代限制、时间限制和精度要求等。

除了在 GAMS 中使用外,KNITRO 还提供了独立的库接口(C/C++、Fortran、Java、Python、MATLAB 和 R),方便用户在自定义应用程序中集成。KNITRO 支持从 AMPL 和 AIMMS 等其他建模系统中调用。

3. GAMS 选项(GAMS Options)

GAMS 提供了一系列与 KNITRO 求解器交互的通用选项,这些选项在 GAMS 层面控制求解器的行为。以下是一些关键的 GAMS 选项:

  • iterlim:设置求解器允许的最大迭代次数。默认值通常为 10000,可根据问题的复杂程度进行调整。
  • reslim:设置求解器的最大运行时间(以秒为单位)。用于控制求解时间,避免过长的计算。
  • optcr:设置最优性容差(相对)。对于非凸问题,用于控制求解器接受的最优解与理论最优解之间的相对差距。
  • optca:设置最优性容差(绝对)。用于控制求解器接受的最优解与理论最优解之间的绝对差距。
  • domlim:设置允许的域错误(domain violations)次数上限。超过此限制后求解器将终止。
  • workfactor:控制求解器内存分配的因子。对于大规模问题,可能需要增加此值以避免内存不足。
  • sysout:控制是否在 GAMS 输出中显示求解器的详细日志信息。
  • holdfixed:控制求解器是否允许修改模型中固定变量(fixed variables)的值。

这些选项可通过 GAMS 的 $option 指令或在 solve 语句前使用 option 语句进行设置。

4. 选项汇总(Summary of Options)

KNITRO 提供了丰富的求解器选项,涵盖算法选择、收敛容差、输出控制、多重起点、MIP(混合整数规划)求解等多个类别。以下是主要选项的汇总:

  • 算法控制:algorithm(0=自动, 1=内点法, 2=活性集法, 3=内点法+活性集法混合), bar_directinterval, bar_feasible, bar_initmu, bar_initpt, bar_maxcrossit, bar_murule, bar_penaltyconst, bar_penaltyrule, bar_switchalg, bar_switchobjrange。
  • 收敛容差:tol_opt_abs, tol_opt_rel, tol_feas_abs, tol_feas_rel, tol_comp_abs, tol_comp_rel。
  • 时间与迭代限制:maxtime_cpu, maxtime_real, maxit, maxcgit, maxfevals。
  • 输出控制:outmode(输出模式), outlev(输出详细程度), objrange, opttol。
  • 多重起点:ms_enable(0=禁用, 1=启用), ms_maxsolves, ms_maxbndrange, ms_mintol_complex, ms_msnumto, ms_startpts, ms_seed, ms_maxtime, ms_outsub。
  • MIP 选项:mip_method, mip_maxnodes, mip_maxsolves, mip_integral_gap_abs, mip_integral_gap_rel, mip_roottol, mip_branchrule, mip_selectrule, mip_heuristic, mip_heuristic_maxit, mip_cutoff, mip_central, mip_emphasis。
  • 用户选项:gradopt(梯度选项), hessopt(海森矩阵选项), maxcrossit, soc(二阶修正), feastol, opttol, linsolver(线性求解器选择), scale(缩放选项), shiftinit, slacksystem。

每个选项均可通过 GAMS 的 myModel.OptFile = 1; 配合 knitro.opt 选项文件进行设置,或通过 GAMS 的 option 语句直接传递。

5. 详细描述(Detailed Descriptions)

本节对 KNITRO 的核心选项进行详细说明。

algorithm

选择 KNITRO 所使用的求解算法。可选值包括:0(自动选择,默认值,求解器根据问题特征自动判断最佳算法)、1(内点法/Barrier 算法,适用于大规模问题和具有复杂约束的问题)、2(活性集法/Active Set / SQP 算法,适用于中小规模问题和需要高度精确解的问题)、3(内点法与活性集法混合,先使用内点法进行优化,而后切换到活性集法以提高精度)。算法选择对求解效率和结果质量有显著影响,建议用户根据问题类型进行试验。

gradopt 和 hessopt

控制导数的计算方式。gradopt 控制梯度(一阶导数)的提供方式:0=由用户通过 GAMS 自动提供(推荐),1=由求解器使用有限差分法近似(适用于 GAMS 无法提供精确导数的情况),2=由求解器使用自动微分法计算。hessopt 控制海森矩阵(二阶导数)的提供方式:0=由用户提供,1=由求解器使用 BFGS/SR1 拟牛顿法近似,2=由求解器使用有限差分法近似,3=由求解器使用精确自动微分计算。选择合适的导数选项可以显著影响求解器的效率和数值稳定性。

maxtime_cpu 和 maxtime_real

maxtime_cpu 设置求解器允许的最大 CPU 时间(以秒为单位),maxtime_real 设置最大实际时间(墙钟时间)。当求解时间超过设定值时,求解器将终止并返回当前最佳解。这两个选项对于有时间限制的生产环境尤其重要。

linsolver

选择求解器内部使用的线性方程组求解器。可选值包括:0=自动选择,1=HYBRID(混合求解器),2=MA57(HSL 库中的对称不定求解器),3=MA97(HSL 库中的新一代求解器,推荐用于大规模问题),4=MA27(HSL 库中的求解器,适用于中小规模问题)。不同的线性求解器在内存使用和求解速度方面各有优劣,对于特定类型的大规模问题,选择合适的线性求解器可以带来显著的性能提升。

ms_enable 和 ms_maxsolves

ms_enable 控制是否启用多重起点(Multi-start)全局搜索功能。设置为 1 时,求解器会从多个不同的初始点开始求解,增加找到全局最优解的概率。ms_maxsolves 限制多重起点的最大求解次数。多重起点方法特别适用于非凸优化问题,但会增加总求解时间,用户需要权衡全局搜索质量与计算成本。

mip_method 和 mip_integral_gap_rel

当 KNITRO 求解混合整数非线性规划(MINLP)问题时,mip_method 选择 MIP 求解策略:1=非线性分支定界法。mip_integral_gap_rel 设置 MIP 的相对整数性间隙,当当前最优解与下界之间的相对差距小于此值时,求解器停止并返回当前最优解。

6. 终止测试(Termination Test)

KNITRO 使用一套综合的终止准则来判断优化过程是否收敛。终止条件包括以下几个方面:

  • 最优性条件(Optimality):当前点满足 KKT(Karush-Kuhn-Tucker)条件,即梯度投影范数小于设定的最优性容差(由 tol_opt_abs 和 tol_opt_rel 控制)。最优性条件确保当前解在数学意义上满足优化的必要条件。
  • 可行性条件(Feasibility):当前点满足所有约束条件,即约束违反度小于设定的可行性容差(由 tol_feas_abs 和 tol_feas_rel 控制)。可行性条件确保解处于问题的可行域内。
  • 互补性条件(Complementarity):对于带互补性约束的问题,互补性条件必须得到满足,即互补性误差小于设定的互补性容差(由 tol_comp_abs 和 tol_comp_rel 控制)。
  • 迭代限制:当求解器达到最大迭代次数(maxit)或最大函数评估次数(maxfevals)时终止。
  • 时间限制:当求解器达到 maxtime_cpu 或 maxtime_real 设定的时间限制时终止。
  • 目标函数停滞:当目标函数值在连续多次迭代中变化极小(小于设定的目标函数变化容差)时,求解器判定已达到停滞状态并终止。
  • 不可行性判定:如果求解器检测到问题不可行(即不存在满足所有约束条件的解),将返回不可行状态并终止。
  • 无界性判定:如果求解器检测到目标函数无下界(最小化问题)或无上界(最大化问题),将返回无界状态并终止。

这些终止条件共同作用,确保求解器能够在合理的时间内返回高质量的解。用户可以通过调整相应的容差参数来控制求解器的终止行为,在求解精度和计算时间之间取得适当的平衡。

7. 输出(Output)

KNITRO 提供了多种输出选项,帮助用户了解求解过程中的详细信息。输出控制主要通过 outlev(输出级别)和 outmode(输出模式)两个选项进行管理。

outlev 选项

  • 0:无输出(静默模式)。求解器不输出任何迭代信息。
  • 1:标准输出(默认)。每次迭代输出一行摘要信息,包括迭代次数、目标函数值、约束违反度、步长和梯度等关键指标。
  • 2:详细输出。除了标准输出外,还输出算法内部的计算信息,如线性搜索信息、障碍参数更新等。
  • 3:调试输出。输出所有可用的调试信息,用于诊断求解过程中的问题。

输出内容

标准输出(outlev=1)包含以下列:

  • Iter:迭代次数。
  • f:当前目标函数值。
  • FeasErr:当前约束违反度(可行性误差)。
  • OptErr:当前最优性误差(KKT 条件违反度)。
  • |Step|:步长范数。
  • CGits:共轭梯度迭代次数(若适用)。

终止状态信息

求解结束时,KNITRO 输出一个终止状态代码,指示求解过程的终止原因:

  • 0:正常终止,找到了局部最优解。
  • 1:找到了近似最优解(满足终止容差)。
  • 2:迭代限制达到。
  • 3:时间限制达到。
  • 4:用户中断。
  • 5:可行性问题:问题不可行。
  • 6:无界问题。
  • 7:求解器内部错误。
  • 8:求解器内存不足。
  • 9:求解器检测到问题中的数值错误。
  • 10:求解器检测到达到了停滞点(无法进一步改善)。

在 GAMS 中,KNITRO 的输出会集成到 GAMS 标准的求解摘要报告(solve summary)中,包括模型统计信息、求解状态报告和求解器日志等。

8. 算法选项(Algorithm Options)

KNITRO 的三种核心算法——内点法(Barrier / Interior Point)、活性集法(Active Set / SQP)和混合法——各自具有特定的控制参数。

内点法(Barrier / Interior Point Algorithm)

内点法通过求解一系列障碍参数逐渐趋近于零的障碍子问题来寻找最优解。该方法特别适合处理包含不等式约束的大规模问题。关键参数包括:

  • bar_feasible:控制求解器是否强制所有迭代点可行(0=不强制,1=强制)。强制可行对于某些应用(如工程仿真)非常重要。
  • bar_initmu:设置障碍参数 μ 的初始值。较大的初始值有助于从较远的初始点开始稳定迭代。
  • bar_murule:选择障碍参数的更新策略(0=单调下降,1=自适应,2=探测性)。不同的更新策略影响收敛速度和数值稳定性。
  • bar_penaltyconst:设置障碍罚函数的罚参数。用于平衡目标函数优化和约束满足之间的关系。
  • bar_switchalg:当内点法接近最优解时,是否切换到活性集法进行精细求解。混合策略通常能提高解的质量。
  • bar_directinterval:控制内点法中直接求解(相对于迭代求解)的切换频率。

活性集法(Active Set / SQP Algorithm)

活性集法基于序列二次规划(SQP)思想,在每次迭代中求解一个二次规划子问题,并维护一个活性约束集。该方法在中小规模问题上通常具有较高的精度。关键参数包括:

  • maxcgit:SQP 方法中允许的最大共轭梯度迭代次数。
  • linsolver:指定 SQP 子问题中使用的线性求解器。
  • soc:控制是否启用二阶校正(Second Order Correction),用于处理所谓的马罗托斯效应(Maratos effect),改善收敛性能。
  • slacksystem:控制 SQP 子问题中是否使用松弛变量系统以提高数值稳定性。

混合法(Hybrid Algorithm)

混合算法先使用内点法进行初始阶段的优化,当接近最优解时自动切换到活性集法以提高解的精度。这种方式结合了两种算法的优势,既能处理大规模问题,又能获得高精度的解。混合法的行为通过 bar_switchalg 和 bar_switchobjrange 参数控制。

全局优化(Multi-start)

除了局部优化算法外,KNITRO 还提供了多重起点(Multi-start)全局优化方法。该方法从多个不同的初始点开始重复求解,增加找到全局最优解的概率。关键参数包括:

  • ms_enable:启用(1)或禁用(0)多重起点方法。
  • ms_maxsolves:最大求解次数。每个初始点对应一次完整的求解过程。
  • ms_startpts:指定初始点列表(以文件形式提供),或让求解器自动生成初始点。
  • ms_seed:随机数生成器种子,用于控制初始点生成的随机性。
  • ms_maxtime:多重起点阶段的最大运行时间。
  • ms_outsub:控制是否输出每个子问题的求解信息。

9. 其他特殊特性(Other Special Features)

KNITRO 还提供了一系列特殊功能,以满足更复杂的优化需求。

MPCC(带互补性约束的数学规划)

KNITRO 支持求解带互补性约束的数学规划(MPCC/MPEC)问题。互补性约束形如 x * y = 0, x, y ≥ 0,广泛存在于均衡问题、博弈论、接触力学和经济建模中。KNITRO 通过内点法中的松弛技术自动处理互补性约束,用户只需在 GAMS 中正常声明 MPEC 模型类型即可。

MIP(混合整数规划)能力

KNITRO 具备求解混合整数非线性规划(MINLP)问题的能力,采用非线性分支定界(Nonlinear Branch and Bound)方法。相关选项包括:mip_method(选择 MIP 策略)、mip_maxnodes(最大节点数)、mip_maxsolves(最大子问题求解次数)、mip_integral_gap_rel(相对整数间隙)、mip_branchrule(分支规则)、mip_selectrule(节点选择规则)、mip_heuristic(启用启发式搜索)和 mip_cutoff(剪枝截止值)。

二阶校正(Second Order Correction)

二阶校正功能用于改善 SQP 方法在约束高度非线性情况下的收敛性能。通过 soc 选项启用后,求解器在无法通过标准 SQP 步骤取得满意改进时,会尝试使用二阶校正步骤来避免马罗托斯效应导致的收敛失败。

问题缩放(Scaling)

KNITRO 提供了自动问题缩放功能,通过 scale 选项控制。缩放功能可以改善数值条件较差的优化问题的求解性能。当问题的变量或约束的量级差异很大时,启用缩放通常能显著提高求解速度和数值稳定性。

线性求解器选择

KNITRO 支持多种线性求解器后端,包括 MA27(HSL)、MA57(HSL)、MA97(HSL)和自定义的混合求解器。用户可以通过 linsolver 选项根据问题的规模和结构选择最适合的线性求解器。对于大规模稀疏问题,MA97 通常是最佳选择;而对于中小规模问题,MA57 或 MA27 可能更高效。

自动微分

KNITRO 内置自动微分(Automatic Differentiation)引擎,能够自动计算问题的梯度、海森矩阵和雅可比矩阵。用户无需手动推导并编码导数公式,大幅降低了建模工作量。通过 gradopt 和 hessopt 选项,用户可以控制导数的计算方式(使用用户提供的导数、有限差分近似、自动微分或拟牛顿近似)。

热启动(Warm Start)

KNITRO 支持热启动功能,允许用户使用先前求解得到的最优解作为后续求解的初始点。对于需要反复求解相似问题的应用场景(如参数扫描、敏感性分析、时间序列优化等),热启动可以显著减少求解时间。

回调函数(Callback Functions)

通过 KNITRO 的独立库接口,用户可以注册回调函数以在求解过程的各个阶段执行自定义操作,如监控迭代进度、动态调整模型参数、记录求解日志或提前终止求解过程。这一功能在需要将 KNITRO 集成到自定义应用程序中时特别有用。

 


 

在线留言

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

 

 

 

 

联系我们

 

微信公众号

咨询微信

企业店铺

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