Алгоритм для решения схемы электроснабжения

Я изучаю программирование самостоятельно, и я хотел бы иметь представление о том, как решить эту проблему.

Мне дали набор резисторов с заданными сопротивлениями и заданным значением restot. Я могу выбрать определенное количество резисторов. Как я могу сделать схему, сопротивление которой как можно ближе к восстановлению? Программист сказал мне, что можно использовать генетические алгоритмы, но я не ограничиваюсь этим.

Думаю, мне нужно создать линейную систему уравнений, использующую законы Киршоффа, чтобы сделать уравнения, но поскольку у меня не очень много опыта по проблемам с электричеством или численные алгоритмы для линейных систем, поэтому я хотел бы получить некоторые рекомендации о том, как я могу сделать эти уравнения автоматически в память компьютеров, так как система все время меняется. И как я могу убедиться, что алгоритм сходится к лучшим решениям?

Проблема связана с финским дискуссионным форумом.

Резисторы могут существовать последовательно или параллельно, а их сопротивления складываются по-разному (добавьте значения для серии, добавьте обратные для параллелизма).

Вы можете также иметь сети для резисторов последовательно и параллельно.

Это звучит для меня как classический случай рекурсивной структуры данных, и вы могли бы представить его как дерево, аналогично дереву двоичных выражений: http://en.wikipedia.org/wiki/Binary_expression_tree

Объедините это некоторое строительное дерево (вы должны посмотреть на то, как это делает Prolog), и вы можете найти лучшее сочетание резисторов, которое приближается к вашей общей сумме.

Никаких генетических алгоритмов в этом подходе, хотя вы могли бы использовать генетический подход к построению и очистке дерева.

Чтобы применить генетический алгоритм, вам нужно будет найти способ представлять, мутировать и комбинировать «ДНК» сети резисторов.

Один из способов:

  1. Добавьте некоторое количество резисторов 0 Ом к набору резисторов (представляющих провода).
  2. Количество резисторов от 1 до N
  3. Для некоторых M представьте себе набор из M контактов, включая источник (1) и приемник (M).
  4. Вы можете определить, к каким перекресткам подключены два конечных точки каждого резистора, как уникальный идентификатор сети. Это всего лишь N-кортеж целых пар в диапазоне 1..M. Этот кортеж может быть «ДНК».

Затем:

  1. Создайте кучу случайных сетей из случайных кортежей.
  2. Рассчитайте сопротивление каждой сети
  3. Отбросьте некоторую часть наseleniumия, наиболее удаленного от целевого сопротивления.
  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