我需要解决的问题是计算给定连接电阻列表的电路的总电阻(如果将电阻视为节点,则为邻接列表)。
例如以下电路:
列表将如下所示:
R1 -> R2
R1 -> R3
R2 -> R4
R3 -> R4
每个电阻都有一个 ID 及其阻值。连接元组存储在具有
getFrom
和 getTo
方法的结构中。
我到目前为止开发的递归算法考虑了 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 被考虑了两次)。
有什么想法可以解决这个问题或用其他方法解决问题吗?
我会通过递归减少节点来解决这个问题,而不是电阻器:
为最简单的串联/并联节点(2个并联和2个串联)定义reduce函数。 所有其他的最终都会减少到这些。
有两种操作供您考虑:
对于并联电阻,您必须考虑电阻器:
如果两个电阻在一侧共享一个连接并在另一侧共享另一个连接,您可以减少它们
对于串联电阻,您必须考虑节点:
如果一个节点仅连接两个电阻器,您可以减少它们
算法是:
boolean isStillWorking = true;
do{
boolean foundParallel = reduceParallel();
boolean foundSerial = reduceSerial();
isStillWorking = foundParallel | foundSerial;
}while(isStillWorking);