模型缩放变换
良好的模型缩放可以极大地改善问题的数值特性,从而提高可靠性和收敛性。core.scale_model 转换允许用户将模型的缩放与模型变量和约束的声明分开,这使得模型可以以更自然的形式编写,并且可以根据需要进行缩放和重新缩放,而无需重写模型代码。
将模型进行缩放的转换。 |
设置缩放因子
模型中的组件的缩放因子使用Suffixes声明,如上例所示。为了定义组件的缩放因子,必须首先创建一个名为scaling_factor的Suffix来保存缩放因子。缩放因子后缀可以在模型层次结构的任何级别声明,但在更高级别的models或Blocks上声明的缩放因子优先于在较低级别声明的缩放因子。
缩放后缀是类似字典的,其中每个键是一个Pyomo组件,值是要应用于该组件的缩放因子。
在索引组件的情况下,可以为单个索引声明缩放因子,也可以为整个索引组件声明缩放因子(单个索引的缩放因子优先于整体缩放因子)。
注意
如果在层次结构的多个级别上为组件声明了缩放因子,则将应用最高级别的缩放因子。
注意
也可以(但不鼓励)通过在一个后缀中设置一个键为None的条目来定义一个“默认”缩放因子,该缩放因子将应用于未声明特定缩放因子的任何组件。在这种情况下,将使用最接近要缩放组件声明的默认值(即,在模型层次结构中向上查找时找到的第一个默认值)。
应用模型缩放
core.scale_model 转换提供了两种创建缩放模型的方法。
就地缩放
apply_to(model) 方法可用于直接将缩放应用于现有模型。使用此方法时,目标模型中的所有变量、约束和目标都将替换为新的缩放组件,并应用适当的缩放因子。然后,模型可以像往常一样发送到求解器,但结果将以缩放组件的形式返回,用户必须对其进行反缩放。
创建一个新的缩放模型
或者,可以使用create_using(model)方法来创建一个新的、可解决的模型缩放版本。在这种情况下,原始模型的克隆被生成,变量、约束和目标被替换为等价的缩放版本。用户然后可以将缩放后的模型发送给求解器,之后可以使用propagate_solution方法将缩放后的解决方案映射回原始模型以进行进一步分析。
这种方法的优点是原始模型与缩放模型分开维护,这有助于在找到解决方案后对原始模型进行重新缩放和其他操作。这种方法的缺点是,在处理较大的模型时,克隆模型可能会导致内存问题。