|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|
Алгоритм Дейкстры - нахождение кратчайшего маршрута до каждой вершины02.12.2013, 03:14. Показов 7614. Ответов 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 | |
|
Нахождение кратчайшего пути между заданными городами (алгоритм Дейкстры) Алгоритм Дейкстры - нахождение кратчайшего расстояния с учетом веса линий Алгоритм поиска кратчайшего маршрута Алгоритм Дейкстры с выдачей маршрута Алгоритм решения задачи по определению кратчайшего маршрута Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации:
1. Вернуть возможность использования знаков | 1 l I;. . .
|
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С.
Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
|
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию?
Фраза «Любая достаточно развитая технология неотличима от магии». . .
|
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль?
Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
|
|
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология.
«Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки.
Добавлены следующие реквизиты типа Булево:
- Буквы;
- Цифры;
- Символы.
Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
|
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей.
Самым главным критерием для. . .
|
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store.
И так:
1. Скачиваем с. . .
|