【问题标题】:Calculate total resistance given resistors adjacency list计算给定电阻邻接列表的总电阻
【发布时间】:2016-05-27 04:55:46
【问题描述】:

我需要解决的问题是计算电路的总电阻,给定一个连接电阻列表(如果将电阻视为节点,则为邻接列表)。

例如在以下电路中:

列表如下所示:

R1 -> R2
R1 -> R3
R2 -> R4
R3 -> R4

每个电阻都有一个 ID 和它的电阻值。连接元组存储在具有getFromgetTo 方法的结构中。

到目前为止,我开发的递归算法考虑了计算 2 个任意电阻器之间的总电阻:

private double calculateResistance(Resistor c1, Resistor c2){
    double res = 0;
    for(ComponentConnection cc : getGraph()){
        if(cc.getFrom().getId() == c1.getId()){
            if(cc.getTo().getId() == c2.getId())
                return c1.getRes() + c2.getRes();
            res += (1/calculateResistance(cc.getTo(),c2));
        }
    }
    return c1.getRes() + 1/res;
}

问题在于,当电路中有分叉时,算法无法确定何时完成并复制一些组件(在示例中,R4 被考虑两次)。

任何想法如何解决这个问题或用另一种方法解决问题?

【问题讨论】:

  • 这真的是only关于算法的吗?您是否考虑过所有奇怪的情况,例如 R1->R2、R2->R3、R3->R4、R4->R1?我认为这比您的简单示例所暗示的要困难得多。
  • 前面有一个步骤是判断一个电路是否有效,这个函数只对有效电路使用,那么就不用担心这些情况了。
  • 嗯,好的。 R1->R2,R3,R4->R5 怎么样?还是R1->R2+R3,R4+R5->R6?
  • 我不确定你是否正确地处理了这个问题。可以计算任意 2 个节点之间的电阻,其中一个节点是电路中的(非电阻)点。计算 两个电阻之间的电阻没有意义(除非您的意思是包容性)。计算超过两个电阻的电阻确实...
  • 我怀疑这本质上是递归的。您必须依次将并联电阻减小到其等效值,并将串联电阻减小到它们的总和,直到只剩下一个电阻。它在关闭之前是迭代的,而不是递归的。

标签: java algorithm graph-theory


【解决方案1】:

我会通过递归减少节点而不是电阻来解决这个问题:

  • 从第一个和最后一个节点开始
  • 有中间节点吗?
  • 否 -> 你已经完成了。返回(一个或没有)中间电阻的电阻
  • 是的,有中间节点 -> 通过递归减少中间串联/并行节点来减少。

为最简单的串联/并联节点(2 个并联和 2 个串联)定义 reduce 函数。所有其他人最终都会归结为这些。

【讨论】:

    【解决方案2】:

    有两个操作供您考虑:

    • 减少并联电阻
    • 减少串联电阻

    对于并联电阻,您必须考虑电阻

    如果两个电阻在一侧共享一个连接并在另一侧共享另一个连接,您可以减少它们

    对于串联电阻,您必须考虑节点

    如果一个节点只连接了两个电阻器,您可以减少它们

    算法是:

    boolean isStillWorking = true;
    do{
        boolean foundParallel = reduceParallel();
        boolean foundSerial = reduceSerial();
        isStillWorking = foundParallel | foundSerial;
    }while(isStillWorking);
    

    【讨论】:

    • 是的,它不是递归的......它非常平坦,所以即使是我这样的菜鸟也可以处理复杂性^^
    猜你喜欢
    • 2018-03-19
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    相关资源
    最近更新 更多