【问题标题】:Algorithm to find minimum number of resistors from a set of resistor values. (C++ or Python) [closed]从一组电阻值中找到最小电阻数的算法。 (C++ 或 Python)[关闭]
【发布时间】:2019-05-01 18:07:24
【问题描述】:

我正在尝试设计一种算法,该算法采用电阻值并输出最小数量的电阻器以及与这些电阻器相关的值。我希望算法迭代一组电阻值,并且该组中的值最多可以使用 n 次。我想知道从哪里开始。

系列:Req = R1 + R2 +...

并行:(1/Req) = (1/R1) + (1/R2) +...

输入:

100000 (100k)

设置: {30k, 50k, 80k, 200k}

输出:

2个电阻串联:50k + 50k

2 个电阻并联:200k || 200k

【问题讨论】:

  • 这看起来像是一个组合优化问题。有整本教科书,实际上并不是可以在单个 StackOverflow 答案中解释的东西。在我看来,它有点像 Backpack Problem 的变体,但由于并行交替而变得更加困难。
  • FWIW,这似乎是Dynamic Programming 的工作,如果您能弄清楚如何将其分解为子问题。这是一种相当先进的技术。
  • 我想知道你是否可以建立一个“虚拟电阻”的概念来模拟并联情况(同时记录消耗的电阻数量和哪些),然后将问题减少到串联情况。
  • ...不超过n 次...这也是输入吗?
  • 我已根据 algorithm 标签投票重新开放。 OP 掌握了一个简单的案例,但可能会被搜索空间的组合爆炸所淹没。之前的 cmet 是很好的线索。

标签: python c++ algorithm


【解决方案1】:

这其实挺难的,我能做的最好是提出一个解决第一部分的算法的想法,包含并行的概念看起来也更难,但也许算法可以扩展。

如果您定义一个函数“最佳”,它将目标电阻作为输入并输出产生该电阻的最小电阻集。例如:如果你只有 10K 个电阻,最好(50K)=5*10K。

对于一组可用的电阻器 [A, B, C,...],此函数“最佳”具有以下属性:

  1. best(A) = A 对于集合中的任何 A。

  2. 最佳(目标) = min(最佳(目标-A) + A), 最佳(目标-B) + B,...)

  3. 最佳(0)=0

  4. best(x)=废话,如果 x

这可以用来简化地解决问题。 (我可能会建议您将变量存储在树中。

这里有一个例子来说明一下:


AvailableSet = [10K, 100K]

目标 = 120K

第一次迭代:

最佳(120K) = min[ 最佳(110K) + 10K, 最佳(20K) + 100K]

计算每个子树:

最佳(110K) = min[最佳(100K) + 10K, 最佳(10K) + 100K]

现在已经完成,因为我们可以使用属性计算 min(_) 中的所有内容,因此请备份树: best(110K) = 100K + 10K (我想如果有像这种情况下的平局随机选择一个排列)

最佳(120K) = min[最佳(110K) + 10K , 最佳(20K) + 100K] = ... = 100K + 10K + 10K

这应该可以作为问题前半部分的解决方案,您可以通过添加额外的属性来扩展它,但是以这种方式简化解决问题会变得更加困难。

可能最好的方法是解决问题的前半部分,并使用不同的算法来找到使用并行的最佳解决方案,并确定每种情况下哪个是最小的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 2015-07-09
    • 2015-03-02
    • 2022-08-10
    • 2021-11-21
    相关资源
    最近更新 更多