[英]What is the best approach to obtain initial values for a GEKKO optimisation problem?
我有一个动态控制问题,其中包含大约 35 个自变量、许多中间变量和一些方程式,主要是通过将某些因变量(代表 stream 流量)限制为正值来实施合理的质量平衡。
最初,变量是使用m.Var()
构造函数声明的,但我随后将它们升级为 MV 和 CV 变量,以利用这些类添加的调整属性(如COST
、 DCOST
等)的灵活性。
我注意到当一组变量被配置为MV
时,IPOPT (3.12) 没有产生解决方案(错误报告: EXIT: Converged to a point of local infeasibility. Problem may be infeasible
),但是当一个变量被实例化为Var
返回一个成功的解决方案。 我将变量重新实例化为MV
并系统地删除约束以尝试查明约束方程。 我发现我为自变量提供的一组初始条件构成了不可行性(它导致 stream 的值为 -0.02,对其具有正约束)。 虽然RTOL
可能可以用来解决这种情况的问题,但我认为这不是正确的通用方法。 我试过COLDSTART=2
但不知道如何解释生成的presolve.txt
文件。
首先,是否有一些标准功能可以帮助解决这种情况,或者是否应该确保最初的猜测代表一个可行的解决方案。
其次,为什么只有当变量被声明为MV
而不是装饰较少的Var
时,才能产生成功的解决方案?
m.Var()
为优化器创建了额外的自由度,而m.Param()
创建了一个由用户确定的数量。 m.Var()
类型可以升级为m.SV()
作为 state 变量或m.CV()
作为受控变量。 m.Param()
类型升级为m.FV()
用于固定值或m.MV()
用于操纵变量。 如果为这些类型打开STATUS
参数,那么它们也会变成自由度。 有关FV
、 MV
、 SV
和CV
类型的更多信息,请参阅 APMonitor 文档和Gekko 文档。 由于额外的自由度,该问题可能变得可行。 尝试将m.MV()
设置为m.SV()
以保留m.Var()
声明的自由度。
初始解决方案通常最容易从稳态模拟中获得。 本文中还有其他详细信息:
这是我通常使用的流程图:
论文中还有关于COLDSTART
选项如何工作的更多详细信息。 如果求解器报告成功求解,则不应存在约束违规。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.