Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.20.224.107] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Собственно сабж. Гуглил, но гуглить по неизвестному материалу сложновато. Везде предлагается найти кратчайший или n кратчайших. В моем случае нужно найти все пути от одной вершины к другой. Всё осложняется присутствием циклов в графе.
Заранее спасибо. Добавлено Производительность посредственна. |
Сообщ.
#2
,
|
|
|
А ничего, что таких путей может быть бесконечное число - я могу миллион раз прокрутиться по циклу и только потом пройти дальше
|
Сообщ.
#3
,
|
|
|
Значит, нужно записать множество всех путей в общем виде, примерно как мы пишем решение неопределенной системы уравнений. Встретил цикл, обозначь числом k произвольное количество проходов по нему и иди дальше.
|
Сообщ.
#4
,
|
|
|
это не достаточно, а потом путей может быть несчетное множество
|
Сообщ.
#5
,
|
|
|
Ммм, ну я же вот и говорю, что не знаком с материалом. Как бы объяснить.
Мне нужны все различные пути между двумя вершинами, где каждое ребро в конкретном пути встречается только единожды. |
Сообщ.
#6
,
|
|
|
тогда можне решить полным перебором, на все возможные пермутации ребер
|
Сообщ.
#7
,
|
|
|
Ссылку на материал какой-нибудь, или хотя бы определение на словах "возможные пермутации ребер" можно?
|
Сообщ.
#8
,
|
|
|
Пусть есть три ребра 1 2 3
Тогда все пермутации это 1 2 3 1 3 2 2 1 3 3 1 2 3 2 1 Т.е все разные порядки на ребрах |
Сообщ.
#9
,
|
|
|
А потом выбросить те наборы, которые не начинаются с нужной вершины и не заканчиваются нужной, а также те которые не смежны (если так называется два ребра с одной вершиной) или не совпадает направление?
Я думал можно это выбрасывать на этапе перестановок как-то. |
Сообщ.
#10
,
|
|
|
Цитата Pr0[)!9Y @ А потом выбросить те наборы, которые не начинаются с нужной вершины и не заканчиваются нужной, а также те которые не смежны (если так называется два ребра с одной вершиной) или не совпадает направление? Я думал можно это выбрасывать на этапе перестановок как-то. Да. ДА. |
Сообщ.
#11
,
|
|
|
Цитата Pr0[)!9Y @ Мне нужны все различные пути между двумя вершинами, где каждое ребро в конкретном пути встречается только единожды. Это понимать как "любое ребро встречается ровно один раз" или "любое ребро встречается максимум один раз"? |
Сообщ.
#12
,
|
|
|
Цитата OpenGL @ максимум |
Сообщ.
#13
,
|
|
|
Тогда перестановки не работают, т.к. могут существовать пути, не содержащие каких-либо определенных вершин. Да к тому же при числе ребер, превышающих 20, программа будет работать слишком долго, даже с условием о некритичности времени Можно предложить вариант перебора, отсекающий все ненужные пути:
В конце мы получим в конечной вершине список путей, ведущих в нее. Единственное НО - алгоритм не будет работать в случае петель (то есть когда ребро выходит и входит в одну и ту же вершину), но легко адаптируется под этот случай. |
Сообщ.
#14
,
|
|
|
Цитата OpenGL @ Да, понял я это когда реализовал несколько алгоритмов найденных в сети. И т.к. я рекурсию исключил, из-за большой ее глубины, модифицировать например 4-й листинг отсюда чтобы добавлялись пути не из всех вершин после мучений так и не удалось. Всё увенчалось тем, что я не оценил насколько долго это будет работать.Тогда перестановки не работают, т.к. могут существовать пути, не содержащие каких-либо определенных вершин. OpenGL, огромное спасибо. Всё получилось. Только маленькая деталь, без которой у меня выходил вечный цикл. Добавлять вершину в очередь надо только в том случае, если был добавлен хотя бы один путь. |
Сообщ.
#15
,
|
|
|
Цитата OpenGL @ Тогда перестановки не работают, Если с умом взять то все работает, надо брать перестановки начинающие в вершине старт, и заканчивающиеся в вершине финиш. Кроме того надо пересмотреть перестоновки всех возможных длин. Алгоритм экспоненциальный, Ваш алгоритм тоже экспоненциальный. Экспоненциальные алгоритмы медленые. Но полиномианльного не существует. |