Линеаризация разветвленных цепей
Здравствуйте.
В программе я собираюсь сделать «блоки вычислений», то есть подпрограммы, которые будут выдавать некоторые значения (выходы), основываясь на своих входах. Эти блоки можно будет соединять произвольным образом. (Исключая образования петель).
Проблема в том, что на схеме они работают параллельно, а на деле, конечно, нужно будет вычислять их последовательно. Вопрос в том, как найти правильную последовательность блоков для вычисления (чтобы каждый блок вычислялся только после всех блоков, от которых он зависит, то есть всех, что соединены с его входами).
Например, для схемы 1) возможна последовательность a, b, c, d, h, f, g, а для 2) a, b, c, h, f, g, d, e.
Существуют ли «научно обоснованные», эффективные алгоритмы для таких вещей?
Я могу, конечно, написать что-то вроде последовательного перебора блоков с заталкиванием в отдельный список всех блоков, которые еще не могут быть вычислены и дальнейшему проходу по нему.. или попробовать сортировать их, но мне кажется, что это не тру... В реальности блоков может быть несколько сотен или тысяч.
Спасибо.