Здравствуйте, Al_, Вы писали:
Al_>Вчитайтесь плс. Имхо интересно.
Al_>Вопрос в основном математический. Как расчитать полное сопротивление схемы? Al_>Предполагается описание схемы на база ООП. Каждый резистор(к примеру) — объект, с определенными связями (пробовал брать за объект узел, но ничего хорошего не придумал).
Al_>Какую структуру лучше выбрать? Я рассматривал дерево.
Если ты выберешь для представления — не дерево, а граф, то это будет адекватнее.
Простой пример: цепь резисторного моста:
Vcc -> R1, R2
R1 <- Vcc, -> R3, R4
R2 <- Vcc, -> R3 (!!! это уже под-узел другой ветки), R5
...
Конечно, можно решать задачу путем определения участия каждого элемента в цепи. Но это — сурово.
Есть же типовая методика для решения таких задач.
Итак, граф цепи. Элементы — это ребра между узлами (точками коммутации).
1) в электрической цепи разделяют:
— источники напряжения (бесконечное сопротивление — разрыв)
— источники тока (нулевое сопротивление — КЗ)
— чисто активные/реактивные элементы.
Будем надеяться, что в цепи нет нелинейных элементов.
Если есть реактивные — будем иметь дело с комплексными числами, если нет — с вещественными.
2) Исключаем все источники, заменяя их на активные элементы (КЗ и разрывы).
3) Полученный граф будем последовательно упрощать.
* ребра-разрывы — выбрасываем
* ребра-коротыши — стягиваем две вершины в одну, ребро выбрасываем
* ребра-петли — выбрасываем (эту операцию, возможно, еще придется повторить).
Далее будем повторять:
* если к вершине (кроме полюсов) нет ребер — удаляем ее.
* если к вершине (кроме полюсов) подходит одно ребро — это обрыв — удаляем вершину и ребро.
* если к вершине (кроме полюсов) подходят два ребра — это последовательное соединение — вершину удаляем, ребра заменяем на одно.
* если ребро подходит к одной и той же вершине — это петля — удаляем его.
* если к двум вершинам подходят несколько ребер — это параллельное соединение — заменяем ребра на одно.
* наконец, если три ребра образуют треугольник — заменяем его на звезду (удаляем ребра, добавляем новую вершину и три новых ребра к вершинам треугольника).
Продолжаем, пока есть что упрощать.
В результате остаются два полюса и ребро между ними. Его сопротивление и есть сопротивление цепи.
Внешне — кажется, что алгоритм непродуктивен (постоянно занимаемся перебором всех вершин и ребер).
Однако он с легкостью поддается оптимизации.
Заводится список/множество нерассмотренных ребер и вершин; изначально в этом списке — все-все-все.
Из него вынимаем первую попавшуюся вершину и исследуем ее.
Если в результате у этой вершины изменились ребра — вновь помещаем ее в список.
Аналогично — с ребрами. Кроме того, когда мы добавляем вершину (по правилу треугольник-звезда) — тоже помещаем ее в список.
Список может быть с приоритетами: вершины отсортированы по числу ребер (сперва нули, затем одиночные, затем последовательности, затем все остальные).
Как представить такой граф — это уже интересная задача.
Объект ребро — атрибут: сопротивление; две вершины.
Объект вершина — множество ребер.
Объект граф — множество вершин (и, как объединение всех вершин — множество ребер).
Перекуём баги на фичи!
Re[2]: Сопротивление схемы электрических соединений.
Здравствуйте, Кодт, Вы писали:
К>Продолжаем, пока есть что упрощать. К>В результате остаются два полюса и ребро между ними. Его сопротивление и есть сопротивление цепи.
Не очень понял: разве не бывает графов без треугольников, кратных ребер и вершин степени два??
Вроде бы указанные редукции к ним уже не применимы.
Re[3]: Сопротивление схемы электрических соединений.
Здравствуйте, mab, Вы писали:
mab>Здравствуйте, Кодт, Вы писали:
К>>Продолжаем, пока есть что упрощать. К>>В результате остаются два полюса и ребро между ними. Его сопротивление и есть сопротивление цепи. mab>Не очень понял: разве не бывает графов без треугольников, кратных ребер и вершин степени два?? mab>Вроде бы указанные редукции к ним уже не применимы.
Бывают, бывают. Например, куб.
Я уже ТОЭ в достаточной мере забыл, чтобы вспомнить, как разруливаются циклы. Как-то это делается...
Все равно там переход от цикла к звезде.
Перекуём баги на фичи!
Re[4]: Сопротивление схемы электрических соединений.
Здравствуйте, Кодт, Вы писали:
К>Я уже ТОЭ в достаточной мере забыл, чтобы вспомнить, как разруливаются циклы. Как-то это делается... К>Все равно там переход от цикла к звезде.
А чем все-таки методы узловых потенциалов или, например, контурных токов плохи? Вроде бы составляешь систему и вперед.. Главное -- думать не надо
Re[17]: Сопротивление схемы электрических соединений.
Здравствуйте, mab, Вы писали:
mab>Давай я попробую раз и навсегда прояснить, почему предоложенный "подход" мне кажется довольно абсурдным. mab>>>Звучит прямо как "ты за советскую власть? Al_>>(: Почти так и есть. Мне интересен этот подход. Думаю не придется отказываться от него.
Al_>>Можно, но со своей спецификой. Вызовы практически всех методов рекурентные, это здорово увеличивает производительость. mab>Во-первых, скорее уж рекурсивные.
Я думал это одно и тоже. /: mab>Во-вторых, увеличивает по сравнению с чем?
Если говорить в рамках поставленой задачи, то не знаю (скорее всего матричный метод). А вообще... помнишь, ставший уже классический пример с вычислением факториала?
mab>Может напомнить пример про вычисление чисел Фибоначчи по реккуррентному соотношению?
Милости просим, если не затруднит. С удовольствием посмотрю.
mab>В-третьюх: ведь ясно, что число путей в графе между фиксированной парой вершмн может быть экспоненциально велико. Поэтому совсем уж не ясно, о какой производительности идет речь: программа на графе из сотни вершин заснет и уже больше не проснется.
Поговорим об этом, когда дойду до конкретной реализации.
mab>В-четверых: зачем в рамках решаемой задачи это нужно
Смотри.
class CObject
{
public:
BOOL CurrentIsCalculated; // при изменении структуры эти зачения
BOOL EndNodePotentialCalculated; // должны обнулитьсяdouble Current; // Здесь хранится выч. значение токаdouble EndPotential; // ...значение потенциала
CObject();
CObject(double dImpedans);
virtual ~CObject();
CObject *pPrevItem;
CQueue *pNextItems;
CObject *GetFirstObject();
void AppendNextItemsToQueue(CQueue *pQueue);
double Impedans; // Сопротивление объектаdouble CalculateCurrent(); // Вычисляет ток, протекающий по объекту
// по соотношению 1-го правила Кирхгоффа.double VoltageFall(); // Падение напряжения на объектеdouble EndNodePotential(); // Потенциал в узле за объектом
};
class CCircuitry
{
BOOL StructureChanged; // Флаг изменения схемыpublic:
CCircuitry();
~CCircuitry();
CObject *FirstObject;
CObject *AddObjectTo(CObject *pObject, double dImpedans);
//* Установка исходных данныхvoid SetEndNodePotential(CObject *pObject, double dPotential);
};
Al_>>GetFirstItem() — возвращает указатель на самый первый элемент; mab>Какой-такой самый первый элемент
Смотри сам.
Этото значение потребовалось в CalculateCurrent() сбора всех объектов схемы в одну очередь, чтоб затем их можно было перебрать.
В реализации CalculateCurrent() есть один момент, так что пока не проси привести его.
mab>>>Что такое "рядом находящиеся"? Al_>>...элементы. см. класс. mab>Смотрю. И офигеваю, потому что вроде бы особым тупизмом обычно не отличаюсь, но сейчас -- хоть убей не понимаю, что к чему. mab>
)% А вот эти разве под это описание не подходят?!
CObject *pPrevItem;
CQueue *pNextItems;
Al_>>Никогда не занимаюсь распределением методов/свойств (кто за что отвечает) до написания кода. Имхо, пустая трата времени. mab>Может это как-то и называется, но не ООП точно. Потому что в мало-мальски приличной системе такой подход приведет к катастрофе -- будет вноситься заплатка за заплаткой до тех пор, пока никто уже не будет вообще понимать, что происходит.
/: спасибо за критику. Пока краха ниразу не снучалось.
mab>В столь любимом тобой ООП типична ситуация, когда время на предварительную проработку на порядок больше времени написания кода.
Полностью с тобой соглласен, но в здесь, на работе, у меня нет возможности "предварительно прорабатывать", а то что я тут пишу мало заметно... поэтому тыкаемся, тыкаемся... За выходные я немного продвинулся...
Al_>>Лучше написать и наглядно оценить, затем что надо переделать. Может еще блок-схему посоветуешь написать перед началом? /: mab>Посоветую хорошенько продумать дизайн системы перед тем, как ее писать
Ты будешь смеяться, но я еше толком методику не выбрал, а от нее много что зависит. но ты мне уже помог. За это тебе спасибо.
Al_>>Какую-то часть обязательно распихаю, возможно всю. mab>И какую же часть? Такое ощущение, что ты думаешь, будто ООП само за тебя это решение примет.
Как потребуется, так и решу.
Al_>>Посмотрим. Как дойду до дела. Возможно что-то и вынесу за пределы ООП, в чем проблема-то?! тут главное эхотаг продумать (: mab>Проблема в том, что думать об этом надо сейчас.
Все все равно не предусмотришь.
Al_>>Что? Перебор путей? Да мало-ли что может потребоваться... mab>О боже... mab>1) Потребоваться кому? mab>2) Потребоваться когда? mab>3) Почему о том, что может потребоваться еще непонятно когда и непонятно зачем ты думаешь сейчас? Или этому учит ООП?
Al_>>Можно — можно... mab>Если не сложно -- приведи пример.
mab>>>Вообще же здесь есть ошибка проектирования (с точки зрения ООП): имеем класс, представляющий элемент, а сам контейнер никакому классу не соответствует. На мой взгляд, именно контейнер должен решать вопрос о построении матрицы смежности графа по собственному содержимому. Al_>>При желании можно обойтись и без него. Да и создать его всегда можно. mab>Ну да, я представляю себе: сначала итератор, а потом контейнер. Может это уже преувеличение, но и до этого дойти недолго.
Уже сдалал (см. выше) и, вроде никто от этого не умер. Ы?
mab>Вообще же дискуссия стала вырождаться. Если у тебя конкретный вопрос -- задай его. Например: как спроектировать такую систему. Тогда можно что-то конкретное сказать, например, что здесь видны такие абстракции, как "схема", "узел сети", "ребро сети".
Вот конкретный вопрос:
Теорема: Ток, протекающий по объекту, равен сумме токов объектов NextItems,
за вычетом токов объектов, для которых очередь NextItems такаяже как у "этого" объекта.
На основании этого расчитывается ток объекта.
mab>Вообще, лучше это в форуме "Проектирование" спрашивать.
MB
mab>Если есть привязка к C++, то, соответственно, милости просим в соответствующий форум. Только не надо обижаться, если там будут в очень крепких выражениях поминать твой CObject.
Ну думаю, что сейчас уже не такими крепкими (как видишь, там кое что переделал).
mab>С точки зрения computer science объяснено уже все: по схеме строишь систему ЛУ, а потом ее решаешь, например Гауссом. Еще советую обратить внимание на те ссылки, которые тебе дали -- весьма полезно.
Да. Сразу посмотрел и куда надо сохранил. Но пока на уме немного другая методика. Сейчас, к сожалению, уже нет времени писать. В следующем письме.
Автоматизация.ERP
Re[2]: Сопротивление схемы электрических соединений.
Здравствуйте, Кодт, Вы писали:
Al_>>Вопрос в основном математический. Как расчитать полное сопротивление схемы? Al_>>Предполагается описание схемы на база ООП.
К>Если ты выберешь для представления — не дерево, а граф, то это будет адекватнее. К>Простой пример: цепь резисторного моста: К>
К>Vcc -> R1, R2
К>R1 <- Vcc, -> R3, R4
К>R2 <- Vcc, -> R3 (!!! это уже под-узел другой ветки), R5
К>
Как мне сказали, это немножно не дерево (: но у меня это реализовано следующим образом:
Vcc -> R1, R2;
R1 <- Vcc; -> R3, R4
R2 <- Vcc; -> R5 (R3 второй раз не включается, он следующий элемент только для R1).
R3 <- R1; -> R5
R4 <- R1; -> End
R5 <- R2; -> End
К>Конечно, можно решать задачу путем определения участия каждого элемента в цепи. Но это — сурово.
Согласен. Уже отказался от этого.
К>Есть же типовая методика для решения таких задач. К>Итак, граф цепи. Элементы — это ребра между узлами (точками коммутации).
К>1) в электрической цепи разделяют: К>- источники напряжения (бесконечное сопротивление — разрыв) К>- источники тока (нулевое сопротивление — КЗ) К>- чисто активные/реактивные элементы.
Для начала упростим задачу, используя только активные элементы. Крайности, имхо, можно учесть и потом.
К>Будем надеяться, что в цепи нет нелинейных элементов.
Потом будут (: Сначала надо эту решить.
К>Если есть реактивные — будем иметь дело с комплексными числами, если нет — с вещественными.
Только вещественные.
К>2) Исключаем все источники, заменяя их на активные элементы (КЗ и разрывы).
К>3) Полученный граф будем последовательно упрощать.
К>* ребра-разрывы — выбрасываем
Это те, которые тольо одним концом присоеденены к узлу?
К>* ребра-коротыши — стягиваем две вершины в одну, ребро выбрасываем
Я, так понимаю, это с нулевым сопротивлением...
К>* ребра-петли — выбрасываем (эту операцию, возможно, еще придется повторить).
Оба конца — к одному узлу?
Я, выше, все уточнил, чтоб не было путаницы.
Все верно?
К>Далее будем повторять: К>* если к вершине (кроме полюсов) нет ребер — удаляем ее. К>* если к вершине (кроме полюсов) подходит одно ребро — это обрыв — удаляем вершину и ребро. К>* если к вершине (кроме полюсов) подходят два ребра — это последовательное соединение — вершину удаляем, ребра заменяем на одно. К>* если ребро подходит к одной и той же вершине — это петля — удаляем его. К>* если к двум вершинам подходят несколько ребер — это параллельное соединение — заменяем ребра на одно. К>* наконец, если три ребра образуют треугольник — заменяем его на звезду (удаляем ребра, добавляем новую вершину и три новых ребра к вершинам треугольника).
К>Продолжаем, пока есть что упрощать. К>В результате остаются два полюса и ребро между ними. Его сопротивление и есть сопротивление цепи.
Все понятно. А есть 100% гарантия, того что останется одно ребро и 2 вершины? Если да, тогда я просто рад (: К>Внешне — кажется, что алгоритм непродуктивен (постоянно занимаемся перебором всех вершин и ребер).
Отнюдь. Или, что ты подразумеваешь под непродуктивностью?..
К>Однако он с легкостью поддается оптимизации. К>Заводится список/множество нерассмотренных ребер и вершин; изначально в этом списке — все-все-все. К>Из него вынимаем первую попавшуюся вершину и исследуем ее. К>Если в результате у этой вершины изменились ребра — вновь помещаем ее в список. К>Аналогично — с ребрами. Кроме того, когда мы добавляем вершину (по правилу треугольник-звезда) — тоже помещаем ее в список. К>Список может быть с приоритетами: вершины отсортированы по числу ребер (сперва нули, затем одиночные, затем последовательности, затем все остальные).
Ок! (:
Единственное — интересны, также, токи по каждому ребру. Но как алгоритм упрощения он весьма и весьма превлекателен.
А нелинейные элементы надо выность за пределы такого упрощения.
К> К>Как представить такой граф — это уже интересная задача.
Вот оно! Самое интересное.
К>Объект ребро — атрибут: сопротивление; две вершины. К>Объект вершина — множество ребер. К>Объект граф — множество вершин (и, как объединение всех вершин — множество ребер).
Спасибо.
Автоматизация.ERP
Re[3]: Сопротивление схемы электрических соединений.
К>>Как здесь организовать дерево? Al_>Как мне сказали, это немножно не дерево (: но у меня это реализовано следующим образом: Al_>
Al_>Vcc -> R1, R2;
Al_>R1 <- Vcc; -> R3, R4
Al_>R2 <- Vcc; -> R5 (R3 второй раз не включается, он следующий элемент только для R1).
Al_>R3 <- R1; -> R5
Al_>R4 <- R1; -> End
Al_>R5 <- R2; -> End
Al_>
Al_>
То есть из графа схемы ты делаешь орграф:
— у каждого ребра есть вершина-исток и вершина-сток
— список ребер, выходящих из стока, хранится в списке "следующие элементы"
— исток идентифицирован стоком "предыдущего" элемента
Почему бы в модели сразу не разделить объекты:
— вершины (клеммы)
— ребра (элементы)
Основное свойство клеммы — это потенциал; свойство элемента — сопротивление (и, как следствие разности потенциалов — ток).
При этом становится несущественно, где у элемента перед, а где зад. (В твоей модели — существенно).
Как выберешь, так и хрен с ним.
Опять же, ввод модели упрощается: просто указываешь множество клемм, и дальше — список элементов (клемма,клемма,сопротивление).
Нет нужды вводить фиктивные элементы Vcc, Vgnd.
К>>* ребра-разрывы — выбрасываем Al_>Это те, которые тольо одним концом присоеденены к узлу?
Разрыв — это элемент с бесконечным сопротивлением.
К>>* ребра-коротыши — стягиваем две вершины в одну, ребро выбрасываем Al_>Я, так понимаю, это с нулевым сопротивлением...
Да.
Я их перечислил для полноты картины (поскольку КЗ и ХХ возникают при удалении источников тока и напряжения).
К>>* ребра-петли — выбрасываем (эту операцию, возможно, еще придется повторить). Al_>Оба конца — к одному узлу?
Да.
К>>Продолжаем, пока есть что упрощать. К>>В результате остаются два полюса и ребро между ними. Его сопротивление и есть сопротивление цепи. Al_>Все понятно. А есть 100% гарантия, того что останется одно ребро и 2 вершины? Если да, тогда я просто рад (:
Если мы умеем уничтожать циклы (превращая их в звезды) — то, без сомнения. Это легко доказать по индукции.
Al_> К>>Внешне — кажется, что алгоритм непродуктивен (постоянно занимаемся перебором всех вершин и ребер). Al_>Отнюдь. Или, что ты подразумеваешь под непродуктивностью?..
Имел в виду, что при сокращениях приходится постоянно сканировать граф. При тупой реализации — это исключительно долгое занятие (порядка O(N^3), если я не путаю).
К>> К>>Как представить такой граф — это уже интересная задача. Al_>Вот оно! Самое интересное.
Остаюсь при своем имхо, что вершины и ребра — это разные объекты (и агрегировать друг в друга не нужно).
Как сохранить при сокращениях информацию о токе через каждый элемент? Очень просто.
Каждый раз, удаляя элемент, мы не забываем его, а помечаем как выбывший.
Новые "эффективные" элементы помечаем, как вошедшие.
Клеммы мы тоже не забываем...
В результате получаем такую модель: Vcc -- R -- Gnd
Ток нам известен.
Если R — это замена последовательного соединения, то восстанавливаем клеммы и напряжения на них по току;
если параллельное — то токи по напряжению;
если звезда — то по страшной формуле.
Продолжаем, пока не останется эффективных элементов.
Перекуём баги на фичи!
Re[4]: Сопротивление схемы электрических соединений.
Здравствуйте, Кодт, Вы писали:
Al_>>Как мне сказали, это немножно не дерево (: но у меня это реализовано следующим образом: Al_>>
Al_>>Vcc -> R1, R2;
Al_>>R1 <- Vcc; -> R3, R4
Al_>>R2 <- Vcc; -> R5 (R3 второй раз не включается, он следующий элемент только для R1).
Al_>>R3 <- R1; -> R5
Al_>>R4 <- R1; -> End
Al_>>R5 <- R2; -> End
Al_>>
К>То есть из графа схемы ты делаешь орграф: К>- у каждого ребра есть вершина-исток и вершина-сток К>- список ребер, выходящих из стока, хранится в списке "следующие элементы" К>- исток идентифицирован стоком "предыдущего" элемента
Верно. Посмотри на объект:
class CObject
{
public:
BOOL CurrentIsCalculated; // при изменении структуры эти зачения
BOOL EndNodePotentialCalculated; // должны обнулитьсяdouble Current; // Здесь хранится выч. значение токаdouble EndPotential; // ...значение потенциала
CObject(double dImpedans);
virtual ~CObject();
/* Вот они, родные */
CObject *pPrevObject;
CQueue *pNextObjects;
CObject *GetFirstObject();
/* Нужно для "переброса" всех объектов в одну очередь, чтоб потом их можно было безболезнено перебирать. См. метод CCircuitry::CollectAllObjects(CQueue **pAllObjects) ниже */void AppendNextItemsToQueue(CQueue *pQueue);
double Impedans; // Сопротивление объектаdouble CalculateCurrent(); // Вычисляет ток, протекающий по объектуdouble VoltageFall(); // Падение напряжения на объектеdouble EndNodePotential(); // Потенциал в узле за объектом
};
К>Почему бы в модели сразу не разделить объекты: К>- вершины (клеммы) К>- ребра (элементы)
А что это даст?
К>Основное свойство клеммы — это потенциал; свойство элемента — сопротивление (и, как следствие разности потенциалов — ток). К>При этом становится несущественно, где у элемента перед, а где зад. К>(В твоей модели — существенно).
Да, это нарушает логику... но пока при работе с такой системой я сталкивался с одними плюсами (: Посмотри ниже как легко она упрощается.
К>Опять же, ввод модели упрощается: просто указываешь множество клемм, и дальше — список элементов (клемма,клемма,сопротивление).
Ввод организован следующим образом: задаешь элемент, и к нему в список Next'ов добавляется новый. Легко и просто. Все это делает метод CCircuitry::AddObjectTo(CObject *pObject, double dImpedans).
А вот и схема:
class CCircuitry
{
BOOL StructureChanged; // Флаг изменения схемыpublic:
CCircuitry();
~CCircuitry();
/* Корень "дерева" */
CObject *FirstObject;
CObject *AddObjectTo(CObject *pObject, double dImpedans);
/* Собирает в одну очередь все элементы схемы */void CollectAllObjects(CQueue **pAllObjects);
/* Упрощение схемы по предложенному тобой алгоритму (реализация ниже)*/void SchemeSimplification();
void DeleteObject(CObject *pObject);
// Установка исходных данныхvoid SetEndNodePotential(CObject *pObject, double dPotential);
};
К>Нет нужды вводить фиктивные элементы Vcc, Vgnd.
А я и не ввожу.
Для Vcc и Vgnd просто задаётся значение EndNodePotentialCalculated=TRUE и, соответственно, EndPotential=const.
К>>>* ребра-разрывы — выбрасываем Al_>>Это те, которые тольо одним концом присоеденены к узлу?
К>Разрыв — это элемент с бесконечным сопротивлением.
К>>>* ребра-коротыши — стягиваем две вершины в одну, ребро выбрасываем Al_>>Я, так понимаю, это с нулевым сопротивлением... К>Да.
К>Я их перечислил для полноты картины (поскольку КЗ и ХХ возникают при удалении источников тока и напряжения).
К>>>* ребра-петли — выбрасываем (эту операцию, возможно, еще придется повторить). Al_>>Оба конца — к одному узлу? К>Да.
Вот так просто это все выглядит:
// Рёбра-разрывы выбрасываютсяif (!pObject->pNextObjects) if (!pObject->EndNodePotentialCalculated)
{
DeleteObject(pObject);
break;
}
// Рёбра-петли выбрасываютсяif (pObject->pNextObjects->FindByData(pObject->pPrevObject))
{
DeleteObject(pObject);
break;
}
// Ребра-коротыши: стягиваются две вершины в одну, ребро выбрасываетсяif (!pObject->Impedans)
{
DeleteObject(pObject);
break;
}
// Последовательное соединение:if (pObject->pNextObjects)
{
if (!pObject->EndNodePotentialCalculated) // Узел не должен запитываться.
{
CObject *pSecondObject;
pObject->pNextObjects->ChoiseItems(); // Открывается выборка след. эл-товif (pSecondObject=(CObject*)pObject->pNextObjects->SelectFromChoise())
if (!pObject->pNextObjects->SelectNextFromChoise())
{
// То есть в выборке только 1 элемент
pObject->Impedans += pSecondObject->Impedans;
DeleteObject(pSecondObject);
break;
}
}
}
К>Если мы умеем уничтожать циклы (превращая их в звезды) — то, без сомнения. Это легко доказать по индукции.
Если цикл не внёс именения в схему — значит завис ==> Принимаем меры...
Al_>> К>>>Внешне — кажется, что алгоритм непродуктивен (постоянно занимаемся перебором всех вершин и ребер). Al_>>Отнюдь. Или, что ты подразумеваешь под непродуктивностью?..
К>Имел в виду, что при сокращениях приходится постоянно сканировать граф. При тупой реализации — это исключительно долгое занятие (порядка O(N^3), если я не путаю).
Возможно. Как там говорится "оптимизация на этапе разработки — корень зла в программировании". Доживем увидим.
К>Остаюсь при своем имхо, что вершины и ребра — это разные объекты (и агрегировать друг в друга не нужно).
Сначаля добью свою методику, потом помотрим.
К>Как сохранить при сокращениях информацию о токе через каждый элемент? Очень просто. К>Каждый раз, удаляя элемент, мы не забываем его, а помечаем как выбывший. К>Новые "эффективные" элементы помечаем, как вошедшие. К>Клеммы мы тоже не забываем...
К>В результате получаем такую модель: Vcc -- R -- Gnd К>Ток нам известен. К>Если R — это замена последовательного соединения, то восстанавливаем клеммы и напряжения на них по току; К>если параллельное — то токи по напряжению; К>если звезда — то по страшной формуле.
(: У меня есть одно предложение, как вообще обойтись без сворачивания.
Т.н. ООП-метод решения системы уравнений.