|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|
Алгоритм Дейкстры - нахождение кратчайшего маршрута до каждой вершины02.12.2013, 03:14. Показов 7419. Ответов 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
Алгоритм Дейкстры, нахождение кратчайшего пути Алгоритм Дейкстры (нахождение кратчайшего пути) Нахождение кратчайшего пути в графе (алгоритм Дейкстры) |
|
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
|
||||||
| 10.12.2013, 20:15 | ||||||
|
1
|
||||||
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
||||||||
| 11.12.2013, 03:58 [ТС] | ||||||||
|
Если будут из вершины 1 в вершину 2 вести три ребра с весами : a 2, b 2, c4, то какое мы выберем? Первое попавшееся? Добавлено через 7 часов 4 минуты Сделал кажется, результат: Судите! Алгоритм изложен выше. Маршрут искал через вектор P, как в статье на хабре. Восстановление маршрута в методе getPath(...). Исходный код:
Добавлено через 13 минут опачки ![]() кстати, пытаюсь скормить своему алгоритму ваш пример: Алгоритм Дейкстры - нахождение кратчайшего маршрута до каждой вершины ищет путь 1 - 2 - 4 и стоимостью 7, хотя должен искать 1 - 3 - 4 и стоимостью 5, правильно? В чем может быть ошибка, Qwertiy? А что вы правили? Buckstabue Может я здесь же ошибся? За основу брал не твой алгоритм. Добавлено через 5 минут Поправил косяк. Мне нужно цикл выполнить столько раз, сколько у меня вершин - 1, для нахождения пути ДО КАЖДОЙ вершины, правильно? У меня почему то стояло 7 раз. Поправил, правильно обсчитывает твою матрицу. Стоимость 5, 1 - 3 - 4
0
|
||||||||
|
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
|
|
| 12.12.2013, 02:04 | |
|
VladSharikov, все изменения сделаны в функции getIndexOfVertexWithMinimalDistance()
Короче говоря, смотрите мой скриншот с конспектом в том самом посте. Там символ Алгоритм элементарен: мы нашли кратчайший путь из A в B, при этом заполняли массив меток marks, изначально i = индекс вершины конца пути. Действуем следующим образом: Пока i != индекс отправления: смотрим все окрестные вершины i ищем такую вершину j, которая удовлетворяет условию marks[j] + adjancedMatrix[j][i] == marks[i] включаем полученную вершину в путь и делаем i = j ------------------------------------ У моей реализации алгоритма, скорее всего есть два недостатка: 1) не учтен тот факт, что изначально все вершины имеют метку, равную максимальному значению unsigned short, что-то вроде имитации бесконечности. Оданако! При прибавлении к такому числу любого положительного числа происходит переполнение разрядов и условие marks[j] + adjancedMatrix[j][i] == marks[i] может сработать в тот момент, когда marks[j] равно максиальному числу 2) скорее, всего, но не обязательно, моя реализация алгоритма рассчитана на неорграф. Чтобы сделать под орграф скорее всего надо передавать в функцию getIndexOfVertexWithMinimalDistance() не отдельный ряд матрицы смежности, а всю матрицу смежности и сверять путь правильным условием marks[j] + adjancedMatrix[j][i] == marks[i] какое я писал выше, а не текущим условием marks[j] + adjancedMatrix[i][j] == marks[i] , которое по идее неправильно, но проверять некогда Исправление ошибок - дело пяти минут
0
|
|
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|
| 12.12.2013, 02:13 [ТС] | |
|
Buckstabue, я свое уже натворил, буду работать над своим.
может есть графы с которыми моя программа не сработается?
0
|
|
|
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
|
|
| 12.12.2013, 11:09 | |
|
Не знаю, протестируйте. Причем при тестировании считайте вес кратчайшего пути и сверяйте с полученным через алгоритм Дейкстры. Но лично мне кажется сомнительным восстановление пути по какому-либо массиву обхода вершин во время работы алгоритма
0
|
|
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|
| 12.12.2013, 11:11 [ТС] | |
|
Во время работы массива ничего не восстанпвливается. А что сомнительно? Работает.
0
|
|
|
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
|
|
| 12.12.2013, 11:23 | |
|
VladSharikov, cомнительно то, что во время работы алгоритма имеет какой-либо смысл сохранять вершины для пути, ведь алгоритм Дейкстры рассчитан на поиск расстояния всех вершин графа до заданной и в процессе работы куда он только не заходит, пока не достигнет той которую мы ищем. Просто возьмите большой граф и генерируйте любые сочетания двух вершин и в конце работы программы сверяйте. Мне поначалу показался тоже вполне логичным тот алгоритм, что написал вначале
В чем ваш алгоритм заключается?
0
|
|
|
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
|
|
| 12.12.2013, 13:00 | |
|
0
|
|
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
||
| 12.12.2013, 13:32 [ТС] | ||
|
Например, мы сейчас в 5 вершине, проверяем метку 10 вершины, она изменилась на 3, например, значит на 10 (или на 9, если с 0 индекса идет счет) место поставим 5. И так далее. В итоге, у нас получиться массив из разных чисел. Например, мы хотим узнать как добраться до вершины 10. Для восстановления пути в 10 вершину запомним 10 вершину. Смотрим 10 элемент массива - там 5. Запомним 5. Смотрим 5 эл. массива, там, например 3 (а это источник). Запомним 3. В итоге получиться 10, 5, 3. Выведем в обратном порядке, это и будет путь. Что сомнительно? Подробнее читайте в статье с хабра из 1 поста. Все работает при любом количестве вершин, думаю.
0
|
||
|
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
|
|
| 12.12.2013, 22:21 | |
|
VladSharikov, нет времени проверять алгоритм, не могли бы вы рассказать, как он будет работать на таком графе? Путь из 1->3
0
|
|
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|
| 12.12.2013, 23:10 [ТС] | |
|
Слишком маленький граф.
Могу показать на своем : http://habr.habrastorage.org/c... a80979.jpg 1) R7 - метка 0, остальные оо. Вектор P = 7 7 7 7 7 7 7 7 7 2) R3 - метка 8 должны изменить 3 позицию вектора P на 7. Изменили. Осталось так же. P = 7 7 7 7 7 7 7 7 7 R5 - метка 1, в 5 позицию поставим 7. Опять так же. P = 7 7 7 7 7 7 7 7 7 R6 - метка 1, R8 метка 1. Вектора не изменяться. P = 7 7 7 7 7 7 7 7 7 3) Минимальная метка у R5. R7 рассмотрена, R1 - метка 8. На место R1 поставим текущую вершину, то есть 5. P = 5 7 7 7 7 7 7 7 7 4) Минимальная у R6, R7 рассмотрена, если пойдем в R8, то метка не измениться, вектор P не измениться. В R3: метка станет 3, измениться вектор P. P = 5 7 6 7 7 7 7 7 7. R4 метка станет 8. На 4м месте поставим текущую вершину - 6. P = 5 7 6 6 7 7 7 7 7. 5) Минимальная у R8. Все вокруг рассмотрено. Все останется как есть. 6) минимальная у R3. Все кроме R2 рассмотрено. Метка R2 стала 7. В массив запишем на второе место текущую вершину - 3. P = 5 3 6 6 7 7 7 7 7. 7) Минимальная у кого? R2 кажется. Если сунемся в R1 - ничего не измениться. В R4, ничего не измениться, в R9 - метка R9 станет 13. На 9 место в векторе Р запишем текущую вершину - 2. P = 5 3 6 6 7 7 7 7 2. 8) мин у R1. Все рассмотрено вокруг. Все как есть. 9) мин у R4. R2 рассмотрена, с R9 работаем. Метка R9 станет 8+2 = 12<13, значит метка измениться. Запишем на 9 место текущую вершину - 4. P = 5 3 6 6 7 7 7 7 4. Все вершины рассмотрены. P = 5 3 6 6 7 7 7 7 2 - вектор ПЭ. Для восстановления пути из 7 в 1: смотрим 1 значение - там 5, смотрим 5 значение - там 7. Пришли в источник. Путь: 1 <- 5 <- 7. Для восстановления пути из 7 в 2: смотрим 2 значение - там 3, смотрим 3 - там 6, смотрим 7 - там 7. Значит путь 2<-3<-6<-7. Правильно? Для 7->3: сморим 3 - там 6, смотрим 6 - там 7. 3<-6<-7 Для 7->4: смотрим 4 - там 6, смотрим 6 - там 7. 4<-6<-7 Для 7 в 5, 6, 8 - один путь: 5,6,8<-7 Для 7->9: смотрим 9- там 4, смотрим 4 - там 3, смотрим 3 - там 6, смотрим 6 - там 7. 9<-4<-6<-7. Все пути восстановлены, лаба зачтена
0
|
|
|
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
|
|
| 13.12.2013, 11:40 | |
|
VladSharikov, граф-то может и маленький, но с моей точки зрения отлично показывает бессмысленность сохранения пути во время обхода и у меня есть подозрения, что подобные алгоритмы будут тупить
0
|
|
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|
| 13.12.2013, 11:48 [ТС] | |
|
Buckstabue, в векторе просто останется P = {1,1} в вашем случае. Значит Для второй вершины 2<-1, для третьей 3<-1, вот и все. Но дело ваше. Пока ни разу проблем не было.
Добавлено через 4 минуты Алгоритм Дейкстры - нахождение кратчайшего маршрута до каждой вершины этот пример работает правильно
0
|
|
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|
| 13.12.2013, 11:51 [ТС] | |
|
Ваш граф :
p.s.: на буковки не надо смотреть, матрица осталась от моего варианта. p.p.s.: вот еще что нужно сделать. может придет в голову как это сделать? вообще, неформальное описание задачи такое: дана сеть роутеров и компьютеров. у меня, например, были только кружки - только роутеры. в некоторых случаях есть и компьютеры (хосты). Особенность хоста в том, что до него можно найти путь, но он не участвует в нахождении других маршрутов, то есть нельзя через него проложить путь. Как это можно задать в программе?
0
|
|
|
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
|
|
| 13.12.2013, 12:09 | |
|
1
|
|
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|
| 13.12.2013, 12:35 [ТС] | |
|
? В смысле. Поясни, пожалуйста
1
|
|
|
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
|
|
| 13.12.2013, 13:25 | |
|
1
|
|
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|
| 13.12.2013, 20:51 [ТС] | |
|
Блин, ты башка ваще)))
Спасибо огромное)
0
|
|
| 13.12.2013, 20:51 | |
|
Помогаю со студенческими работами здесь
38
Нахождение кратчайшего пути между заданными городами (алгоритм Дейкстры) Алгоритм Дейкстры - нахождение кратчайшего расстояния с учетом веса линий Алгоритм поиска кратчайшего маршрута Алгоритм Дейкстры с выдачей маршрута Алгоритм решения задачи по определению кратчайшего маршрута Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений.
. . .
|
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения
Продолжаю серию постов о дискретно-событийной модели рабочего. . .
|
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы
Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
|
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция
Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
|
|
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
|
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
|
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
|
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика
Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
|