如何从阻力网络中消除循环

Posted

技术标签:

【中文标题】如何从阻力网络中消除循环【英文标题】:How to remove cycles from a resistance network 【发布时间】:2015-01-17 16:56:42 【问题描述】:

我有一个由无向图表示的电阻网络,其边代表电阻值。一些节点称为驱动程序,一些节点称为接收器,其他节点是内部节点。目标是计算从每个驱动器到每个接收器的有效阻力。该图可以有循环,星三角网络。所以可以用下面的公式来计算有效电阻。

Wiki article

请注意,如果图形没有任何循环,那么简单的 DFS 遍历将为每个接收器提供一个驱动器有效电阻。但如果它有循环,则必须删除循环。一种方法是将图形复制到临时图形中,然后使用上述公式从临时图形中删除除驱动程序和接收器之外的所有节点。对所有驱动接收器对执行此操作,但这种方法对于大型密集图非常耗时。通过将图形存储在 tcl 哈希表或 std::tr1::unordered_map 中,我得到了这么长的运行时间。

您对计算每个驱动器对每个汇电阻的有效方法有任何想法吗?

我有一个低效的解决方案,即 每个接收器的每个驱动程序 将原始图复制到临时图 然后使用我上面提到的 wiki 文章从临时图中删除除源和接收器之外的所有节点。 最终的临时图表将给出该源和该汇之间的有效阻力。 此解决方案的运行时间对于大输入数据是不可接受的,因此我需要更好的解决方案。

【问题讨论】:

正确的方法应该是执行Nodal analysis而不是图形转换。 我没有查看 wiki 文章,但为什么不计算生成树呢?例如 DFS 生产的那个? 我认为您可以将此建模为max flow 问题,其中流动是阻力并计算路线 我不知道如何对这个问题进行节点分析,因为不存在电压,只给出了电阻网络。另外我不认为生成树,最大流量可以解决这个问题。你能解释一下这些将如何解决我的问题吗? 1.指定源节点为1V,汇节点为0 2.进行节点分析,得到总电流I 3.R = V / I = 1 / I 【参考方案1】:

要计算从每个驱动器到每个接收器的有效阻力,您无需执行图形转换。相反,你可以

    对于每对驱动器和接收器,将驱动器节点分配为 1V,将接收器节点分配为 0 执行nodal analysis,它只需要线性方程公式。你会得到当前的I 从驱动程序到接收器的流。 根据定义,有效阻力R = V / I = 1 / I

【讨论】:

感谢您的回答。你能发布算法视图吗,因为我觉得它太抽象而无法实现。 @doptimusprime “算法视图”是什么意思? @doptimusprime 您可以参考en.wikiversity.org/wiki/Electric_Circuit_Analysis/…,了解如何将节点分析公式化为矩阵方程。然后,您可以使用您喜欢的库或您自己的求解器来求解矩阵方程。 感谢您的回答。我正在分配赏金给你。 此解决方案可能需要较长的输入大小。您有有效的解决方案吗?

以上是关于如何从阻力网络中消除循环的主要内容,如果未能解决你的问题,请参考以下文章

阻力即升力

如何限制for循环中的网络调用次数?

如何在 Keras 中为循环神经网络 (RNN) 使用嵌入层

回声消除技术

基于深度神经网络的回声消除和噪声抑制的任务分割

unity中汽车经过加速带如何实现加速