分区分离_转换
(类来自 pyomo.gdp.plugins.partition_disjuncts)
- class pyomo.gdp.plugins.partition_disjuncts.PartitionDisjuncts_Transformation[源代码]
基础类:
Transformation通过采用Kronqvist等人2021年提出的“P-split”公式[KMT21],将析取模型转换为等效的析取模型(可能具有更紧密的壳松弛)。在每个析取中,凸和可加性可分离的约束通过引入辅助变量来分割成单独的约束,这些辅助变量上界由分割创建的子表达式。增加分区数量可以导致更紧密的壳松弛,但代价是模型尺寸的增大。
转换将创建一个以“_pyomo_gdp_partition_disjuncts_reformulation”开头的唯一名称的新Block。 该Block将包含新的Disjunct对象,每个对象对应于正在转换的一个Disjunct。这些对象将具有转换后的约束,并且位于新的Disjunctions中,每个Disjunction对应于原始的一个。此外,辅助变量和分区约束将在此Block上声明,以及将原始indicator_vars与转换后的Disjuncts的indicator_vars链接的LogicalConstraints。所有被转换的原始GDP组件将被停用。
参考文献
参见 [KMT21]。
- Keyword Arguments:
targets (target_list, optional) –
指定要放松的目标或目标列表,可以是单个组件或组件列表。
如果为None(默认值),则整个模型将被转换。请注意,如果转换是在外部进行的,则目标列表应在克隆模型之前附加到模型上,并且该列表将指定克隆实例上的目标。
variable_partitions (_to_dict, optional) –
指定的变量分区,可以是全局的或每个Disjunction的。
期望是一组不相交的ComponentSets,其并集是所有Disjunctions中出现的所有变量,或者是从每个活动的Disjunction到一组不相交的ComponentSets的映射,其并集是该Disjunction中出现的变量集。在任何情况下,如果Disjunction中的任何约束仅是部分可加性可分离的,这些集合必须是一个有效的分区,以便这些约束相对于此分区是可加性可分离的。要为未在映射中作为键出现的Disjunctions指定默认分区,请将分区映射到‘None’。
最后,请注意,在包含部分可加性可分离函数的约束的情况下,要求用户指定变量分区。
num_partitions (_to_dict, optional) –
可以是一个单一的值,这样所有的Disjunctions将变量划分为P个集合,或者是一个Disjunctions到每个活动Disjunction的P值的映射。将None映射到P值将指定如果未明确指定给定Disjunction的值,则使用P的默认值。
请注意,如果任何约束包含部分可加性可分离函数,则必须在variable_partitions参数中指定具有这些约束的Disjunctions的分区。
variable_partitioning_method (_to_dict, default=
) – 一个函数,它接受一个Disjunction对象和一个数字P,并返回一个有效的变量分区,这些变量出现在Disjunction中,分为P个分区。
请注意,如果您使用此方法来计算分区,则必须为‘P’提供一个值。
请注意,如果任何约束包含部分可加性可分离函数,则无法自动计算Disjunctions的分区。请在variable_partitions参数中为具有这些约束的Disjunctions指定分区。
assume_fixed_vars_permanent (bool, default=False) –
如果为True,即使固定变量后来被解除固定,转换也会创建一个正确的模型。也就是说,边界将基于固定变量的边界计算,而不是它们的值。然而,如果固定变量永远不会被解除固定,可能会得到一个更紧密的模型,并且固定变量不需要有边界。
请注意,这对固定的BooleanVars没有影响,包括Disjuncts的指示变量。无论这些变量是否保持固定,转换始终是正确的。
compute_bounds_method (default=
) – 用于计算表达式边界的回调函数,以便限制由转换创建的辅助变量的边界。
一些预实现的选项包括
compute_fbbt_bounds(默认值),以及
compute_optimal_bounds
或者你可以编写自己的回调函数,该函数接受一个Expression对象、一个包含原始实例的变量和全局约束的模型,以及一个配置好的求解器,并返回一个元组(LB, UB),其中如果找不到有效的边界,则任一元素可以为None。
compute_bounds_solver (可选) –
配置的求解器对象,用于compute_bounds_method。
特别是,如果compute_bounds_method是‘compute_optimal_bounds’, 这将用于解决子问题,因此如果任何Disjunctions包含非线性约束,则需要处理非凸问题。
方法
__init__()apply(model, **kwds)已弃用。
apply_to(model, **kwds)将转换应用于给定的模型。
create_using(model, **kwds)使用此转换创建一个新模型
属性
CONFIG成员文档
- apply(model, **kwds)
已弃用。
自版本4.3.11323起已弃用:Transformation.apply() 已被弃用。请使用 Transformation.apply_to() 进行原地转换,或使用 Transformation.create_using() 创建新的独立转换模型实例。
- apply_to(model, **kwds)
将转换应用于给定的模型。
- create_using(model, **kwds)
使用此转换创建一个新模型