|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|
Алгоритм Дейкстры - нахождение кратчайшего маршрута до каждой вершины02.12.2013, 03:14. Показов 7150. Ответов 37
Метки нет (Все метки)
Привет.
Понятно как находить кратчайший путь до каждой вершины из заданной. Непонятно как проложить маршрут. Например, вот статья : http://habrahabr.ru/post/111361/ Там сказано, что есть вектор P, который изначально равен 1 (все значения - их столько, сколько вершин - равны единице). Если вдруг у нас измениться метка вершины на меньшую (то есть появился путь короче предыдущего), то число вектора, которое отвечает за эту вершину измениться на номер текущей вершины. Например, есть вершина 5 - ее метка 10, а теперь появился путь через 4 вершину - метка стала 7. 4 запишется на 5 место в векторе. Правильно? Дак вот это не работает (или я что-то не понимаю), если у нас путь до вершины минимальный проходит более чем через одну вершину, как в моем случае. Матрица: Вот матрица: 0 3 0 0 7 0 0 0 0 3 0 4 9 0 0 0 0 0 0 4 0 0 0 2 8 0 0 0 9 0 0 0 7 0 0 4 7 0 0 0 0 0 1 0 0 0 0 2 7 0 0 1 7 0 0 0 8 0 1 1 0 2 0 0 0 0 0 0 7 2 0 0 0 0 0 4 0 0 0 0 0 Или граф: http://habr.habrastorage.org/c... a80979.jpg Наикратчайший маршрут из 7 из 9 такой: 7->6->4->9. Делая как предлагает автор, я получил вектор P = {1,1,6,1,1,1,1,1,4}. Из этого следует, что в 3 вершину путь такой: 7 -> 6 -> 3 — правильно. Но в 9 такой: 7 -> 4 -> 9. Это неправильно. Я что-то не так сделал?
0
|
|
| 02.12.2013, 03:14 | |
|
Ответы с готовыми решениями:
37
Алгоритм Дейкстры, нахождение кратчайшего пути Алгоритм Дейкстры (нахождение кратчайшего пути) Нахождение кратчайшего пути в графе (алгоритм Дейкстры) |
|
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
|
||||||
| 03.12.2013, 03:42 | ||||||
|
Ох, не знаю, не знаю что здесь такого сложного. Могу поделиться программой, которая ищет длину наикратчайшего пути до конкретно заданной вершины, построенной для этой задачи: http://acmp.ru/index.asp?main=task&id_task=132 . Тебе небольшое задание: либо свою с нуля записать, либо просто модифицируй цикл так, чтобы он заканчивал свое дело только тогда, когда будут помечены все вершины графа.
Ну а про алгоритм восстановления пути расскажу, что помню из универа: пусть нам дана вершина A и B, и расстояние между ними. Тогда строим путь из B к A следующим образом: смотрим всю окрестность вершины B(множество вершин, смежных B), выбираем ту вершину, расстояние до которой из A наименьшее, если таких вершин несколько, то выбираем любую(назовем ее C), включаем ее в путь. Далее опять, изучаем окрестность вершины C, снова выбираем ту вершину, расстояние до которой из А наименьшее, включаем ее в путь. В конце концов мы рано или поздно придем к вершине А и восстановим путь. Может не самое быстрое решение, но реально работющее ![]() Кликните здесь для просмотра всего текста
1
|
||||||
|
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
|
|
| 03.12.2013, 13:54 | |
|
1
|
|
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
|
| 03.12.2013, 15:40 | |
|
Да вы, батенька, почти некропостер.
Возможно вы неправильно прочитали про этот вектор, ибо инициируется он номером вершины с которой начинаем считать, в вашем случае должен быть (7,7,7,7,7,7,7,7,7), ну и далее по тексту модифицируем его. P.S. Помню, в универе, преподаватель давал этот алгоритм в виде кода на паскале, но не объяснил его суть так же доходчиво как в статье, поскольку такой алгоритм мне был без надобности все это время, то я до сих пор думал что пусть это и самый быстрый алгоритм, но и самый трудный в понимании. Или, может, преподаватель рассматривал немного другой вариант алгоритма.
1
|
|
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|
| 03.12.2013, 16:22 [ТС] | |
|
wingblack, точно, неправильно инициализировал.
Но суть не поменялась. Теперь он равен 7 7 6 7 7 7 7 7 9. Тоже самое, но с 7. Может я вообще не понимаю как его строить, проясните. Пс: а что такое некропостер? Старые посты читаю?
0
|
|
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
||
| 03.12.2013, 19:20 | ||
|
"post" - в данном случае "оставлять сообщение" чаще всего употребляется когда кто-то пишет в тему форума многолетней давности. Может и не правильно, попробую сделать разбор вашего примера сегодня чуть попозже. Лично я сам только только сегодня нашел (надеюсь) понимание алгоритма Дейкстры, после прочтения хабра-поста по ссылке. Добавлено через 4 минуты Может напишешь как ты решаешь и выложишь куда-нить ? Не код проги конечно Добавлено через 2 часа 16 минут Вот я попробовал реализовать на той картинке
1
|
||
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
||
| 03.12.2013, 20:35 [ТС] | ||
|
wingblack,
во-первых, спасибо за ответы в любом случае! ![]() во-вторых, по крайней мере длины путей получились у меня и у вас такие же. я не очень понимаю, как изменяется по ходу дела у вас вектор P. Из статьи:
Раньше я делал так. Сейчас можно написать add: Пока писал пост понял, что нужно запоминать текущую вершину с при изменении метки бесконечности на число, а не только с числа на число. P.S.: в то как вы делали не сильно пока вдумался, только зашел домой, сейчас попробую сам еще раз пересчитать. еще раз спасибо большое за ответы, вы очень помогаете ![]() Добавлено через 21 минуту Так стоп смотрю сейчас на то, что сделали вы и нифига не понимаю. поясните как и почему изменяются значения вектора P. На 4 картинке у вас стоит цифра 8, хотя через 8 вообще не надо проходить, чтобы попасть в 4 кратчайшим путем. Может я не так понимаю смысл вектора P? Объясните по какому принципу изменяется вектор P. И смысл этих изменений. И что должно быть на выходе, как это нужно понять будет. Спасибо. p.s.: кода пока что и нет. пока решаю на бумаге, позже буду преобразовывать это все в код.
0
|
||
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
|
| 03.12.2013, 22:18 | |
|
Я могу где-то ошибаться, если что.
Была мысль потратить лишние полчасика и показать наглядно если у тебя есть микрофон чтобы общаться в прямом эфире. Если есть такая возможность - кинь контакт в личку, поддерживается skype, hangout, *вставить_свое* или можно через joinme
1
|
|
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|
| 03.12.2013, 23:22 [ТС] | |
|
Спасибо) прямо сто пятьсот миллионов плюсов)
осталось выдумать как это все закодить)))
0
|
|
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
|
| 04.12.2013, 00:23 | |
|
А что выдумывать, берешь готовую реализацию алгоритма на нужном ЯП и кодишь.
1
|
|
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|
| 04.12.2013, 00:51 [ТС] | |
|
wingblack,
например? готовой толковой пока не нашел. мне нужно на delphi, но пойдет на любом яп) одна фигня
0
|
|
|
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
|
||||||
| 04.12.2013, 03:37 | ||||||
|
Qwertiy, почему это неработающий? Можете привести контр-пример?
Добавлено через 1 час 35 минут Вообще, мой алгоритм восстановления пути правилен, но для удобства требует матрицу инцидентности, а не матрицу смежности. Впрочем, если граф неориентирован, то сойдет и матрица смежности Добавлено через 28 минут Ну и кто говорил, что мой алгоритм нерабочий? Сейчас проверил, все работает Код: Кликните здесь для просмотра всего текста
Входный данные: Кликните здесь для просмотра всего текста
9 7 9
0 3 0 0 7 0 0 0 0 3 0 4 9 0 0 0 0 0 0 4 0 0 0 2 8 0 0 0 9 0 0 0 7 0 0 4 7 0 0 0 0 0 1 0 0 0 0 2 7 0 0 1 7 0 0 0 8 0 1 1 0 2 0 0 0 0 0 0 7 2 0 0 0 0 0 4 0 0 0 0 0
1
|
||||||
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
||
| 04.12.2013, 08:52 | ||
|
http://www.delphisources.ru/pa... oritm.html http://e-maxx.ru/algo/dijkstra http://kvodo.ru/dijkstra-algorithm.html Кстати, на Википедии сейчас увидел вполне наглядное описание алгоритма в картинках.
1
|
||
|
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
|
||||||||||||
| 04.12.2013, 15:27 | ||||||||||||
2
|
||||||||||||
|
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
|
||||||
| 05.12.2013, 00:18 | ||||||
|
Признаюсь, лажанулся. Совсем забыл это правило. Сейчас попробую восстановить. Так-то звучит оно так(Этап 2):
http://imghost.in/img/2013-12/... xzl8gy.jpg Добавлено через 18 минут Вот новая редакция: Кликните здесь для просмотра всего текста
1
|
||||||
| 05.12.2013, 12:01 | |
|
Давно, когда был студентом (и когда ничего не слышали об интернете), придумал свой алгоритм нахождения пути в графе. Скорее всего этот велосипед хорошо известен, а может тот самый Дейкстра и есть. Зацените:
- от весов всех ребер из исходной вершины отнимаем минимальное. В результате вес хотя бы 1 ребра будет 0. Напр http://habr.habrastorage.org/c... a80979.jpg после первого шага 2 ребра обнулились и имеем 3 вершины R5, R6, R7. Теперь оптимальные пути в эти вершины найдены, и все они становятся "началами" - повторяем процедуру (теперь берем все ребра из R5, R6, R7) пока это возможно. Ну вот и все, пути готовы. Вывод на печать - когда ребро "обнулилось" запоминаем в нем источник (а тот знает предыдущий) Да, когда читал книги (уже и не помню какие) запомнилось выражение "каждый участок оптимального пути является оптимальным"
0
|
|
|
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
|
|||
| 05.12.2013, 13:12 | |||
|
1
|
|||
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
||
| 10.12.2013, 18:22 [ТС] | ||
|
Buckstabue,
пришло время писать сам алгоритм, я ведь могу опираться на ваш алгоритм?)) Использовать его могу? Читаю и что-то даже понимаю По-крайней мере, понимаю что для чего нужно. В суть пока смутно вник, но представляю)Buckstabue, скажите, вот эта часть: Алгоритм нужно доработать вы говорили. Вот это и нужно было доработать, правильно? Добавлено через 22 часа 18 минут Кстати, появилось еще несколько вопросов. Можно ли алгоритм найти минимальный путь на графе если из вершины А в вершину Б может быть не один путь, а не сколько? в смысле "ребро" не одно, а несколько. Препод сказал, что нужно обязательно в пути указывать название ребра, которое нужно пройти, чтобы добраться из одной вершины в другую. например, для моего графа (http://habr.habrastorage.org/c... a80979.jpg) нужно записать путь не R1-R2-R3, а такой: R1-A-R2-H-R3. Это нормуль? По-моему, просто лишние телодвижения нужно осуществлять.
0
|
||
|
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
|
|||||||
| 10.12.2013, 18:28 | |||||||
|
Очевидно же, что если неминимальное ребро заменить минимальным, то путь уменьшится. А если вдруг увеличится (ну можно выбрать какой-нибудь хитрый способ подсчёта длины пути), то дейкстра в принципе не применим.
1
|
|||||||
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
||||
| 10.12.2013, 20:00 [ТС] | ||||
|
В любом случае, благодарю за ответ!
0
|
||||
| 10.12.2013, 20:00 | |
|
Помогаю со студенческими работами здесь
20
Нахождение кратчайшего пути между заданными городами (алгоритм Дейкстры) Алгоритм Дейкстры - нахождение кратчайшего расстояния с учетом веса линий Алгоритм поиска кратчайшего маршрута Алгоритм Дейкстры с выдачей маршрута Алгоритм решения задачи по определению кратчайшего маршрута Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
|
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение.
И на уровне агентов добавится между грибами или бактериями взаимодействий.
До того я пробовал подход через многомерные массивы,. . .
|
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Сочетание глобально распределённой вычислительной мощности и инновационных. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|