一种解决电路的算法

我正在自学编程,我想知道如何解决这个问题。

我得到了一组具有给定电阻和给定值的电阻器的电阻器。 我可以选择一定数量的电阻。 如何制作一个尽可能接近电阻的电路? 程序员告诉我,可以使用遗传算法,但我不限于使用遗传算法。

我想我必须使用基尔霍夫定律制作一个线性方程组来制作方程式,但由于我对电力问题没有太多经验,也没有线性系统的数值算法,所以我想对如何制作这些方法有一些指导随着系统一直在变化,方程式会自动进入计算机内存。 我怎样才能确保算法收敛到更好的解决方案?

问题来自芬兰的讨论论坛。

电阻器可以串联或并联存在,并且它们的电阻加起来不同(为串联添加值,为并联添加倒数)。

您还可以使用串联和并联电阻网络。

这听起来像是一个递归数据结构的经典案例,你可以将它表示为树,类似于二进制表达式树: http : //en.wikipedia.org/wiki/Binary_expression_tree

结合一些探索树构建(你应该看看Prolog这样做的方式),你可以找到最接近总数的电阻组合。

虽然您可以采用遗传方法来构建和完善树,但这种方法中没有遗传算法。

要应用遗传算法,您需要找到一种方法来表示,变异和组合电阻网络的“DNA”。

一种方法是:

  1. 在电阻器组中添加一些0欧姆电阻器(代表电线)。
  2. 将电阻从1到N编号
  3. 对于某些M,想象一组M个结,包括源(1)和接收器(M)。
  4. 您可以定义每个电阻的两个端点连接到哪个结点作为网络的唯一标识符。 这只是1..M范围内的整数对的N元组。 这个元组可以是“DNA”。

然后:

  1. 从随机元组生成一堆随机网络。
  2. 计算每个网络的抵抗力
  3. 丢弃距离目标抵抗力最​​远的一些人口。
  4. 将它们的随机对组合起来形成新的网络。 (可能是从父母A或父母B中随机选择每个电阻器端点,概率为50%)
  5. 随机更改几个端点(突变)。
  6. 转到2

不确定它是否真的会像这样工作,但你得到了一般的想法。

毫无疑问,一种更好的非遗传算法,但你特别要求遗传算法,所以你去。

如果你不仅限于遗传算法,那么我认为你也可以借助线性规划来解决这个问题。 您可以按如下方式对问题进行编码,并让求解者为您提供答案。

Required Resistance Of Circuit = x ohms // We want to have total 33 resistors. selected_in_series_1 + selected_in_series_2 +... + selected_in_series_211 + selected_in_parallel_1 + selected_in_parallel_2 + ... + selected_in_parallel_211 = 33 // Resistor in Series (selected_in_series_1 * Resistor_1) + (selected_in_series_2 * Resistor_2) + ..(selected_in_series_211 * Resistor_211) = total_resistence_in series // Similarly write formula for parallel (selected_in_parallel_1 * 1/Resistor_1) + (selected_in_parallel_2 * 1/Resistor_2) + ..(selected_in_parallel_211 * 1/Resistor_211) = 1/total_resistence_in parallel total_resistence_in series + total_resistence_in parallel = Required Resistance Of Circuit