最小电阻数算法

Posted

技术标签:

【中文标题】最小电阻数算法【英文标题】:Minimum # of resistors algorithm 【发布时间】:2015-04-17 21:35:51 【问题描述】:

我正在尝试设计一个简单的算法,该算法采用标准电阻值的向量以及所需电阻值的输入,然后通过串联和并联组合来确定实现该目标所需的最小标准电阻数等效电阻通过串联和并联电阻的任意组合来实现,以最小者为准。

有人有什么想法吗?如果我只想要并联或串联,那会容易得多,但不确定如何将两者结合起来以减少电阻器的总数。

仅供参考,如果您不知道总系列 R = S1 + S2 + ...+ SN 和总并联 R = (1/S1 + 1/S2 + ... + 1/SN)^-1

【问题讨论】:

我忘了补充说我正在 matlab 中尝试这样做,以便可以对代码进行矢量化。我还计划不考虑公差,只使用 5% 电阻的输入列表。 以所有串联和并联方式连接的 n 个电阻器的不同电阻数由oeis.org/A005840 给出。该数对 n 渐近! * (1-log(2)) / (log(2))^(n+1) -> 指数增长。如果有一种明智的方法可以减少这种情况,我会感到惊讶,特别是如果输入值没有太多模式 “标准电阻值”连同它们的容差旨在覆盖整个正实线。换句话说,任何电阻都已经在标准电阻值的容差范围内,因此您可以使用 n=1 电阻解决您的问题。 :-) 那么代码的另一部分将是一个变量输入,您可以在其中列出实验室缺货的电阻值,并将它们从向量列表中删除。跨度> 如果是这样,那么我们几乎可以将其视为一个改变问题。我认为我在回答中建议的方法会奏效。您可能需要考虑的另一个问题:有一些方法可以组合不会分解为串联和并联的电阻器,例如,沿着立方体边缘的电阻器。要真正减少电阻器的数量,您也应该考虑这些网络。 【参考方案1】:

也许遗传算法是最好的?我不知道这个大 O 符号的计算,但它看起来是指数的:O(cⁿ)。

我在另一个网站的post 上发现了这条评论,它是不同值的电阻器可以实现的变化数量(即蛮力): 具有 1 个电阻的网络:1 具有 2 个电阻的网络:2 具有 3 个电阻的网络:10 具有 4 个电阻的网络:68 具有 5 个电阻的网络:558 带 6 个电阻的网络:5186 带 7 个电阻的网络:53805

遗传算法可以避免暴力破解,可能让您更快地得出答案。不幸的是,它不能保证用最少的电阻器就能得到答案。它可能会以更少的工作找到接近的等效电阻值,并且它可以是重量,因此它有利于尽可能少的电阻。

我会继续研究这个并发布我发现的任何其他内容。

【讨论】:

不是指数 O,因为您受算法中“迄今为止的最佳结果”的约束。一旦您知道可以通过 3 个步骤从 A 到 B,您就不需要再检查了。这实际上有点像寻路算法。 哦,太好了,如果一个正态指数 O 方程可以一步求解,那你怎么称呼它? 可能是指数级的? :)【参考方案2】:

创建一个对象来保存一个电阻值,加上它来自的两个电阻,再加上用于从前两个值(串联或并联)中获取值的操作。

使用一些集合数据结构,如 Set 或 ArrayList 来保存电阻对象。您的设置 S1 最初仅包含您拥有的电阻器(1 个电阻器的网络)。现在创建一个集合 S2,它是 S1 的一个元素与 S1 的一个元素的所有组合(串联或并联)。 S3 是 S1 和 S2 的组合。 S4是S1和S3的组合,是S2和S2的组合。继续,直到您的 Sk 成员在您的目标值的容差范围内(例如 1%、5% 或 10%)。生成的阻力对象可以一次一步展开,以找到它的构建方式。

您需要考虑的另一件事是公差如何组合。错误会传播,因此您可能需要 1% 的电阻器才能启动,以便在最后达到您想要的 5% 容差的电阻。

【讨论】:

这个算法是超指数的。即使您的电阻器组相对较小(例如 100 个),您甚至无法在合理的时间或内存量内访问现代计算机上的 5 个电阻器网络(S5 将具有 ~10^12 个元素) . 如果两个不同的组合给出相同的结果(例如R1 + R2 + R3 = R2 + R3 + R1),第二个将不会被存储。这样,它就是一种动态规划算法。如果有办法将对特定问题有用的阻力大小设置为最大值,则更容易获得运行时间和空间估计。

以上是关于最小电阻数算法的主要内容,如果未能解决你的问题,请参考以下文章

一文讲透Dubbo负载均衡之最小活跃数算法

Dubbo的负载均衡算法

Boyer–Moore Majority Vote Algorithm摩尔投票法,众数算法,Java

Boyer–Moore Majority Vote Algorithm摩尔投票法,众数算法,Java

判断回文数算法

Dubbo负载均衡算法