顺序分解

(类来自 pyomo.network.decomposition)

class pyomo.network.decomposition.SequentialDecomposition(**kwds)[source]

基础类:FOQUSGraph

用于Pyomo网络模型的顺序分解工具

以下参数可以在构建此类时设置,或通过options属性设置。

Parameters:
  • graph (MultiDiGraph) –

    一个表示要解决的模型的networkx图。

    default=None (将计算它)

  • tear_set (list) –

    表示要撕裂的边的索引列表。可以通过set_tear_set使用边的元组列表来设置。

    default=None (将计算它)

  • select_tear_method (str) –

    选择撕裂集的方法,可以是“mip”或“heuristic”。

    default=”mip”

  • run_first_pass (bool) –

    布尔值,指示在运行撕裂流收敛过程之前是否先通过网络。

    default=True

  • solve_tears (bool) –

    布尔值,指示是否运行迭代以收敛撕裂流。

    default=True

  • guesses (ComponentMap) –

    用于第一次传递的猜测的ComponentMap (参见set_guesses_for方法)。

    default=ComponentMap()

  • default_guess (float) –

    如果自由变量没有猜测值,则使用此值。

    default=None

  • almost_equal_tol (float) –

    在检查端口值一致性时,低于此差异的数字被视为相等。

    default=1.0E-8

  • log_info (bool) –

    在运行期间将日志记录级别设置为INFO。

    default=False

  • tear_method (str) –

    用于收敛撕裂流的方法,可以是“Direct”或“Wegstein”。

    default=”Direct”

  • iterLim (int) –

    撕裂迭代次数的限制。

    default=40

  • tol (float) –

    停止撕裂迭代的容差。

    default=1.0E-5

  • tol_type (str) –

    容差值的类型,可以是“abs”(绝对)或“rel”(相对于当前值)。

    default=”abs”

  • report_diffs (bool) –

    报告每次迭代中不同撕裂流之间的差异矩阵。

    default=False

  • accel_min (float) –

    Wegstein加速因子的最小值。

    default=-5

  • accel_max (float) –

    Wegstein加速因子的最大值。

    default=0

  • tear_solver (str) –

    用于select_tear_mip的求解器名称。

    default=”cplex”

  • tear_solver_io (str) –

    上述求解器的求解器IO关键字。

    default=None

  • tear_solver_options (dict) –

    传递给求解方法的关键字选项。

    default={}

__init__(**kwds)[source]

在设置默认值后,传递kwds以更新选项属性

方法

__init__(**kwds)

在设置默认值后,传递kwds以更新选项属性

adj_lists(G[, excludeEdges, nodes, multi])

返回一个MultiDiGraph的节点索引的邻接列表和反向邻接列表。

all_cycles(G)

此函数查找有向图中的所有循环。

arc_to_edge(G)

返回图中从弧到边的映射

cacher(key, fcn, *args)

calculation_order(G[, roots, nodes])

依赖tree_order返回节点的计算顺序

check_tear_set(G, tset)

检查指定的撕裂流是否足够。

check_value_fix(端口, 变量, 默认值, 固定, ...)

尝试将变量固定在其当前值或默认值,否则报错

combine_and_fix(port, name, obj, evars, fixed)

对于一个扩展的端口成员,将所有扩展变量的值合并,并将端口成员固定在其总和上。

compute_err(svals, dvals, tol_type)

计算给定tol_type的svals和dvals之间的差异

create_graph(model)

返回一个Pyomo网络模型的networkx MultiDiGraph

cycle_edge_matrix(G)

返回一个循环-边关联矩阵,每个循环中的节点列表的列表,以及每个循环中的边索引列表的列表。

edge_to_idx(G)

返回从边到图的索引的映射

fixed_inputs()

generate_first_x(G, tears)

generate_gofx(G, tears)

idx_to_edge(G)

返回从索引到图的边的映射

idx_to_node(G)

返回图中从索引到节点的映射

indexes_to_arcs(G, lst)

将边索引列表转换为相应的弧

load_guesses(guesses, port, fixed)

load_values(port, default, fixed, use_guesses)

node_to_idx(G)

返回从节点到图的索引的映射

pass_edges(G, edges)

为边缘索引列表调用传递值

pass_single_value(port, name, member, val, fixed)

修复端口成员的值并将其添加到固定集合中。

pass_tear_direct(G, tears)

在给定的撕裂集中传递所有撕裂的值

pass_tear_wegstein(G, tears, x)

将所有撕裂边的目标值设置为numpy数组x中的对应值。

pass_values(arc, fixed_inputs)

将值从一个单元传递到下一个单元,仅记录那些在提供的将块映射到集合的字典中尚未固定的值。

run(model, function)

使用顺序分解计算Pyomo网络模型

run_order(G, order, function[, ignore, ...])

按照提供的顺序调用函数来运行计算

scc_calculation_order(sccNodes, ie, oe)

这决定了计算强连通组件的顺序。

scc_collect(G[, excludeEdges])

这是一个用于在图中找到强连通分量(SCCs)的算法。

select_tear_heuristic(G)

这基于两个标准找到了最佳的撕裂边缘集。

select_tear_mip(G, solver[, solver_io, ...])

这基于两个标准找到了最佳的撕裂边缘集。

select_tear_mip_model(G)

生成一个模型,用于从给定的图中选择眼泪

set_guesses_for(port, guesses)

为给定端口设置猜测

set_tear_set(tset)

设置一个自定义的撕裂集,用于运行分解时

solve_tear_direct(G, order, function, tears, ...)

使用直接代入法来解决眼泪。

solve_tear_wegstein(G, order, function, ...)

使用Wegstein方法解决撕裂问题。

source_dest_peer(arc, name[, index])

返回与源端口成员对等的对象。

sub_graph_edges(G, nodes)

此函数返回包含在由节点列表给出的子图中的边的索引列表。

tear_diff_direct(G, tears)

返回边缘索引的tears列表中所有边缘的src和dest成员的numpy数组值。

tear_set(G)

tear_set_arcs(G[, 方法])

调用指定的撕裂选择方法并返回表示所选撕裂边的弧线列表。

tear_upper_bound(G)

此函数快速找到一组次优的撕裂边。

tree_order(adj, adjR[, roots])

此函数确定有向树中节点的排序。

成员文档

adj_lists(G, excludeEdges=None, nodes=None, multi=False)

返回一个MultiDiGraph的节点索引的邻接列表和反向邻接列表。

Parameters:
  • G – 一个 networkx 的 MultiDiGraph

  • excludeEdges – 在考虑邻居时忽略的边索引列表

  • nodes – 用于形成邻接关系的节点列表

  • multi – 如果为True,邻接列表将包含两个节点之间每条边的(节点,键)元组

Returns:

  • i2n – 从索引到节点的映射,包含所有节点

  • adj – 后继索引的邻接列表

  • adjR – 前驱索引的反向邻接列表

all_cycles(G)

此函数用于查找有向图中的所有循环。 该算法基于Tarjan 1973年的论文《有向图的基本回路枚举》,SIAM J. Comput. v3 n2 1973。

Returns:

  • cycleNodes – 每个循环中节点的列表

  • cycleEdges – 每个循环中边索引的列表

arc_to_edge(G)[source]

返回图中从弧到边的映射

calculation_order(G, roots=None, nodes=None)

依赖tree_order返回节点的计算顺序

Parameters:
  • roots – 被视为树根的节点列表,如果为None,则使用实际的根节点

  • nodes – 树中要考虑的节点子集,如果为None,则使用所有节点

check_tear_set(G, tset)

检查指定的撕裂流是否足够。 如果图减去撕裂边后不是一棵树,则 撕裂集不足以解决该图。

check_value_fix(port, var, default, fixed, use_guesses, extensive=False)[source]

尝试将变量固定在其当前值或默认值,否则报错

combine_and_fix(port, name, obj, evars, fixed)[source]

对于一个扩展的端口成员,将所有扩展变量的值合并,并将端口成员固定为它们的总和。假设所有扩展变量都是固定的。

compute_err(svals, dvals, tol_type)[source]

计算给定tol_type的svals和dvals之间的差异

create_graph(model)[来源]

返回一个Pyomo网络模型的networkx MultiDiGraph

节点是单位,边遵循Pyomo Arc对象。添加到图中的节点由模型中每个Arc的源端口和目标端口的父块确定。使用源和目标指定的方向为每个Arc添加边。模型中的所有Arc都将被使用,无论它们是否处于活动状态(因为这需要在扩展后完成),并且它们都需要是有向的。

cycle_edge_matrix(G)

返回一个循环-边关联矩阵,每个循环中的节点列表,以及每个循环中的边索引列表。

edge_to_idx(G)[source]

返回从边到图的索引的映射

idx_to_edge(G)[source]

返回从索引到图的边的映射

idx_to_node(G)[source]

返回图中从索引到节点的映射

indexes_to_arcs(G, lst)[source]

将边索引列表转换为相应的弧

Parameters:
  • G – 一个与lst对应的networkx图

  • lst – 要转换为元组的边索引列表

Returns:

弧线列表

node_to_idx(G)[source]

返回从节点到图的索引的映射

pass_edges(G, edges)[source]

为边缘索引列表调用传递值

pass_single_value(port, name, member, val, fixed)[source]

修复端口成员的值并将其添加到固定集合中。 如果成员是一个表达式,适当地修复其自由变量的值。 如果成员已经被修复但与val不同,或者成员有多个自由变量,则报错。

pass_tear_direct(G, tears)[source]

在给定的撕裂集中传递所有撕裂的值

pass_tear_wegstein(G, tears, x)[source]

将所有撕裂边的目标值设置为numpy数组x中的对应值。

pass_values(arc, fixed_inputs)[source]

将值从一个单元传递到下一个单元,仅记录那些在提供的将块映射到集合的字典中尚未固定的值。

run(model, function)[source]

使用顺序分解计算Pyomo网络模型

Parameters:
  • model – 一个 Pyomo 模型

  • function – 在网络中的每个块/节点上调用的函数

run_order(G, order, function, ignore=None, use_guesses=False)[source]

按照提供的顺序调用函数来运行计算

Parameters:
  • G – 一个对应于顺序的networkx图

  • order – 图中每个节点的运行顺序

  • function – 在每个块/节点上调用的函数

  • ignore – 传递值时忽略的边缘索引

  • use_guesses – 如果为True,在调用函数之前修复自由变量时,将检查猜测字典

scc_calculation_order(sccNodes, ie, oe)

这决定了强连通分量的计算顺序。它用于帮助确定解决撕裂流的最有效顺序,以防止额外的迭代。这只是将强连通分量作为节点制作一个邻接表,并调用树顺序函数。

Parameters:
  • sccNodes – 每个强连通分量(SCC)中的节点列表的列表

  • ie – 指向强连通分量(SCCs)的入边索引列表的列表

  • oe – 指向强连通分量(SCCs)的外边索引的列表的列表

scc_collect(G, excludeEdges=None)

这是一个用于在图中寻找强连通分量(SCCs)的算法。它基于Tarjan。1972年的深度优先搜索和线性图算法,SIAM J. Comput. v1 no. 2 1972

Returns:

  • sccNodes – 每个SCC中节点的列表的列表

  • sccEdges – 每个SCC中边索引的列表的列表

  • sccOrder – 计算SCC的顺序的列表的列表

  • outEdges – 离开SCC的边索引的列表的列表

select_tear_heuristic(G)

这基于两个标准找到最佳的撕裂边集。 主要目标是最小化任何循环被打破的最大次数。 次要标准是最小化撕裂的数量。

此函数使用分支定界类型的方法。

Returns:

  • tsets – 撕裂集合的列表的列表。返回的所有撕裂集合都是同样好的。通常有大量同样好的撕裂集合。

  • upperbound_loop – 任何单个循环被撕裂的最大次数

  • upperbound_total – 循环的总数

未来的改进

我认为我可以提高这个的效率,但目前来说已经足够好了。以下是一些改进的想法:

1. 减少冗余解决方案的数量。可能会找到集合 [1,2] 和 [2,1]。我从结果中消除了冗余解决方案,但它们可能会出现,这会降低效率。

2. 查看强连通组件而不是整个图。这将减少我们正在查看的图的大小。流程图很少是一个强连通组件。

3. 当你向一个撕裂集添加一条边时,你可以通过仅查看移除该边后的强连通组件来减少分支中的问题规模。

4. 这将返回所有同样好的最优撕裂集。这可能并不是真正必要的。对于非常大的流程图,可能存在极大量的最优撕裂边集。

select_tear_mip(G, solver, solver_io=None, solver_options={})[source]

这基于两个标准找到最佳的撕裂边集。 主要目标是最小化任何循环被打破的最大次数。 次要标准是最小化撕裂的数量。

此函数在Pyomo 中创建一个具有双重加权目标的 MIP 问题,并使用求解器参数进行求解。

select_tear_mip_model(G)[source]

生成一个模型,用于从给定的图中选择眼泪

Returns:

  • model

  • bin_list – 表示每条边的二进制变量列表,按图的边索引进行索引

set_guesses_for(port, guesses)[source]

为给定端口设置猜测

这些猜测将用于检查在第一次运行过程中遇到的所有自由变量。如果自由变量没有猜测,将使用其当前值。如果其当前值为None,将使用default_guess选项。如果该选项也为None,将引发错误。

所有位于非撕裂边下游的端口变量将已经被固定。如果对固定变量有猜测,它将被静默忽略。

猜测应该是一个映射以下内容的字典:

端口成员名称 -> 值

或者,对于索引成员,多个映射的字典:

端口成员名称 -> 索引 -> 值

对于扩展成员,“Value”必须是一个形式为(arc,value)的元组列表,以猜测指定弧的扩展变量的值。然而,如果连接此端口的弧是与其对等体的1对1弧,则单个弧将没有扩展变量,因此应提供常规的“Value”。

此字典不能用于传递表达式类型成员中变量的猜测。在调用run之前,必须将这些变量的猜测分配给变量的当前值。

虽然这种方法使事情更加方便,但它所做的只是:

self.options["guesses"][port] = guesses

set_tear_set(tset)[source]

设置一个自定义的撕裂集,用于运行分解时

该过程将使用此自定义撕裂集,而不是寻找自己的撕裂集,因此可以节省一些时间。此外,这对于了解哪些边需要猜测将非常有用。

Parameters:

tset – 表示要撕裂的边的弧线列表

虽然这种方法使事情更加方便,但它所做的只是:

self.options["tear_set"] = tset

solve_tear_direct(G, order, function, tears, outEdges, iterLim, tol, tol_type, report_diffs)

使用直接代入法来解决眼泪。如果给出了多个眼泪,它们将同时被解决。

Parameters:
  • order – 计算节点的顺序列表的列表

  • tears – 撕裂边缘索引列表

  • iterLim – 运行迭代次数的限制

  • tol – 迭代可以停止的容差

Returns:

差异历史记录的列表列表,每次迭代时输入和输出值之间的差异

Return type:

list

solve_tear_wegstein(G, order, function, tears, outEdges, iterLim, tol, tol_type, report_diffs, accel_min, accel_max)

使用Wegstein方法解决撕裂问题。如果给出多个撕裂,它们将同时被解决。

Parameters:
  • order – 计算节点的顺序列表的列表

  • tears – 撕裂边缘索引列表

  • iterLim – 运行迭代次数的限制

  • tol – 迭代可以停止的容差

  • accel_min – Wegstein加速因子的最小值

  • accel_max – Wegstein加速因子的最大值

  • tol_type – 容差值的类型,可以是“abs”(绝对)或“rel”(相对于当前值)

Returns:

差异历史记录的列表列表,每次迭代时输入和输出值之间的差异

Return type:

list

source_dest_peer(arc, name, index=None)[source]

返回与源端口成员对等的对象。 这可以是目标端口的成员,或者是扩展属性弧的扩展块上的变量。 这将返回对等对象的适当索引。

sub_graph_edges(G, nodes)

此函数返回由节点列表给出的子图中包含的边索引列表。

Returns:

  • edges – 子图中的边索引列表

  • inEdges – 从子图外部开始并在子图内部结束的边索引列表

  • outEdges – 从子图内部开始并在子图外部结束的边索引列表

tear_diff_direct(G, tears)[source]

返回边缘索引的tears列表中所有边缘的src和dest成员的numpy数组值。

tear_set_arcs(G, method='mip', **kwds)[来源]

调用指定的撕裂选择方法并返回表示所选撕裂边的弧线列表。

kwds 将被传递给方法。

tear_upper_bound(G)

此函数快速找到一组次优的撕裂边。这在寻找最优撕裂集时作为初始上限。拥有初始上限可以提高效率。

这是通过构建一个搜索树并仅从所有后边中制作一个撕裂集来实现的。

tree_order(adj, adjR, roots=None)

此函数确定有向树中节点的顺序。这是一个通用函数,可以操作由邻接表和反向邻接列表表示的任何给定树。如果邻接列表不表示树,则结果无效。

在返回的顺序中,有时可以同时计算多个节点。因此,此函数返回一个列表的列表。这些列表表示树的广度优先搜索顺序。按照这个顺序,所有导致特定节点的节点将在它之前被访问。

Parameters:
  • adj – 一个有向树的邻接表。这里使用的是通用的整数节点索引,而不是图本身的节点名称。这使得它可以更容易地用于子图和组件的图。

  • adjR – 与adj对应的反向邻接表

  • roots – 起始节点的索引列表。这些节点不一定是树的根节点,在某些情况下,比如当一个节点发生变化时,变化可能只影响从该节点可达的树中的节点,如果提供了根节点,树中的所有节点可能不会出现在排序中。如果没有提供根节点,则使用树的根节点。