LINUX.ORG.RU
ФорумTalks

[Математикам]Помогите с решением


0

0

Здравствуйте всем!

Позвольте попросить у многоуважаемых участников сообщества помощи. В общем, задача состоит в следующем:

Есть карта автомобильных дорог, скажем, Украины. Вопрос: как найти кратчайший путь, например, из Днепропетровска в Ужгород? Можно, конечно, перебрать все возможные пути и выбрать минимальный из них, но тогда получаются кучи заведомо неверных вариантов... К слову, зачем ехать из Днепра в Ужгород через Донецк, конечно, для бешеной собаки собсно и 7 верст не крюк, и все же, это около шестисот лишних километров? Плюс ко всему, надо еще учесть такой вариант, что на кратчайшом пути, возможно что-то вроде ремонта дороги или движение перекрыто и целесообразнее поехать обходным путем и т.д.
Вот как задать это дополнительное условие (про ремонт дороги и перекрытость движения)?

Игры разума натолкнули на мысль, что кратчайший путь ищется по алгоритму Дейкстры, но что с этим делать дальше, непонятно :(


Спасибо заранее за помощь.



// =^_^=

Ответ на: комментарий от soomrack

>ибо транспорт ходит по расписанию

хм.. это автомобили ездят по расписанию? Как хотят так и ездют. Если бы на автобусах ехали с пересадками на остановках, чтобы побыстрее (или min денег), тогда да.

anonymous
()
Ответ на: комментарий от far_tuna

Кажется, проще всего все время апдейтить длины ребер. Делаешь наследника класса "узел", там все прописываешь. Но код алгоритма похоже подправить все-таки придется... Хотя, если (а так и должно быть), алгоритм получает длину ребра через функцию класса "узел", то можно перегрузить ее, а вот как ему передать время, без вмешательства в код алгоритма -- хз.

soomrack ★★★★★
()
Ответ на: комментарий от soomrack

ЗЫ: последний раз запускал дельфи 10 лет назад.

soomrack ★★★★★
()
Ответ на: комментарий от redgremlin

Ты вот скажи-ка давно у тебя был курс сего предмета?

anonymousI
()
Ответ на: комментарий от soomrack

> Кажется, проще всего все время апдейтить длины ребер. Делаешь наследника класса "узел", там все прописываешь. Но код алгоритма похоже подправить все-таки придется...

повторюсь -- нужно добавить временное измерение в граф -- т.е. каждый узел заменить на много узлов в разное время (с шагом 10 минут)

dilmah ★★★★★
()
Ответ на: комментарий от redgremlin

Ну молодец, большинство за 5 лет даже базовых формул не помнят. Я вот сдал в свое время на 4.5 из 5 дифуры. Сходу ни одного уравнения или системы не решу. Но вспомнить конечно быстрее чем заново обучаться.

anonymousI
()
Ответ на: комментарий от dilmah

> повторюсь -- нужно добавить временное измерение в граф -- т.е. каждый узел заменить на много узлов в разное время (с шагом 10 минут)

нет, если автобус вышел из пункта А в 10:00, то в пункт Б он может прийти и в 11:07

В принципе, лучше хранить нужное число графов в зависимости от начального времени (напр. с шагом в 10 мин.). Усложнять саму конструкцию графа излишне, это разные данные (разные алгоритмы движения, в зависимости от времени), пусть они будут хранится отдельно.

soomrack ★★★★★
()
Ответ на: комментарий от shimon

> А что делаешь-то?

Думаю, как вышесказанные две страницы будут выглядеть на сях, чтобы потом переправить это все на дельфи. Да, я знаю толк в извращениях ;)

> Ты уже переселилась в Украину? :)

Пока нет, как Вы можете наблюдать, я не могу туда доехать, пока не просчитаю дорогу ;)

far_tuna
() автор топика
Ответ на: комментарий от anonymousI

> Какая сложность алгоритма?

в первых постах назвали A-star алгоритм -- не более чем квадратичен по числу узлов

dilmah ★★★★★
()
Ответ на: комментарий от soomrack

> Что ты забыла на Украине?!

Да в принципе ничего из того, что держит меня здесь, просто тамошние люди мне очень нравятся ;)

far_tuna
() автор топика
Ответ на: комментарий от far_tuna

PS: могу даже с работой попробовать подсобить.

soomrack ★★★★★
()
Ответ на: комментарий от soomrack

> оставайся с нами, приезжай в Питер. Тут тоже люди неплохие и с Украиы тоже есть.

Забавный такой, как будто я в на другую сторону Экватора собралась, Украина она ж близко совсем. И потом, куда я от вас денусь, с неимоверной тягой к городу на Неве, с бесконечной любовью к красным кирпичным стенам города по умолчанию, с родными корнями из Брянских лесов и Смоленских озер :)

far_tuna
() автор топика
Ответ на: комментарий от far_tuna

Нету, я там был. Его внутри страны продают на 100$ дороже, чем покупают у нас. Плохо там. Туда хорошо ездить отдыхать и все.

soomrack ★★★★★
()
Ответ на: комментарий от dilmah

>баблопровода вообще нигде кроме дефолтного города нет

Угу. но видел бы ты что творится с энергетикой на постсоветском пространстве... Все продано и вообще не поддерживается, опоры лэп ржавые как дачные бочки, трубопроводы гнилые...

soomrack ★★★★★
()
Ответ на: комментарий от far_tuna

> А на больше и не надо, я ж скучать по белокаменной начну :)

А я к Москве равнодушен. :(

soomrack ★★★★★
()
Ответ на: комментарий от soomrack

> видел бы ты что творится с энергетикой на постсоветском пространстве... Все продано и вообще не поддерживается, опоры лэп ржавые как дачные бочки, трубопроводы гнилые...

у меня родина в крыму -- там уже много лет норма -- горячая вода только по воскресеньям. При том что Черноморнефтегаз добывает газ, там чьи-то важные дети руководят.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

> у меня родина в крыму -- там уже много лет норма -- горячая вода только по воскресеньям. При том что Черноморнефтегаз добывает газ, там чьи-то важные дети руководят.

значит знаешь не по наслышке... грустно.

soomrack ★★★★★
()

теория графов плюс поиск в ширину или простейшая эвристика. Я бы делал на лиспе или, в крайнем случае, на питоне.

amoralyrr ★☆
()
Ответ на: комментарий от soomrack

сумрак прав,

динамическое программирование, однозначно.

AndreyKl ★★★★★
()
Ответ на: комментарий от far_tuna

> Стесняюсь спросить, а что это?

Афигеть. Люди стесняються гугла.. ППЦ.

LamerOk ★★★★★
()

Подходить к задаче только с одной точки зрения на теорию графов - былинный отказ.

Действительно, лучше считать время, проведённое в пути, учитывая то, от чего зависит средняя скорость передвижения: тип дороги, количество поворотов, трафик, особенности транспорта (расписание движения, остановки, объезды, пересадки), возможные преграды: ремонтные работы, аварии.

Если представлять в виде подобия графов, то придётся узлами делать развязки дорог (места, где возможно больше двух направлений движения). Далее, "длина связи" - время, затраченное на движение по участку пути. Имея такое представление, просто найти короткий путь.

anonymous
()

Ещё могу подсказать в какую сторону думать:

Наикратчайший путь между двумя узлами - отрезок на прямой, проложенный через два эти узла.

Из каждого узла у нас выходят несколько дорог с разным временем передвижения по ним. Можно выделить дороги, наиболее подходящие для движения, сравнивая время движения по ним (длину) и угол отклонения от нормали (простая геометрия), но это грубая обработка, т.е. можно отбросить лишь заведомо неверные варианты, для более чистой нужно учитывать дальнейший путь (т.е. также рекурсивно идти до точки назначения).

Можно делать красивее, запускать два таких потока, один из точки отправления, другой - из точки назначения, а можно вообще просчёт каждого нового узла в отдельном, ну это зависит от количества и качества дорог.

anonymous
()
Ответ на: комментарий от anonymous

Уважаимый анонимус, спасибо за участие в судьбе многострадального диплома :) Графы тут присутствуют по умолчанию, ибо заведующий кафедры захотел чтобы так :) и больше интересует практический вопрос впихивания "расписания" в программу :)

anonymous
()
Ответ на: комментарий от anonymous

Уважаимый анонимус, спасибо за участие в судьбе многострадального диплома :) Графы тут присутствуют по умолчанию, ибо заведующий кафедры захотел чтобы так :) и больше интересует практический вопрос впихивания "расписания" в программу :)

А что расписание?

Есть база данных расписаний движения транспорта (время прибытия и отправки на остановку). Если есть точное расписание и маршрут движения, несложно определить время появления транспорта в определённой точке пути. Далее, можно посчитать среднюю скорость движения между двумя узлами. Возможно ещё ввести дополнительные узлы, как остановки транспорта (к примеру, чтобы пересесть на более скоростной транспорт, на который было невозможно сесть на предидущем узле). Далее, имея среднее время движения транспорта между двумя узлами мы можем провести линию связи между ними.

А так, пробегаемся по базе данных расписаний и для каждого участка движения (между двумя остановками или двумя развязками, зависит от извращённости программиста) проводим связь, длина которой равна времени движения на участке. Ничего сложного.

anonymous
()
Ответ на: комментарий от anonymous

Просчитанные расписание (т.е. уже готовые графы) советую кешировать. Расписания в исходном виде редактировать удобно, а вот просчитывать их каждый раз совершенно не нужно, достаточно обсчитывать только изменения.

anonymous
()
Ответ на: комментарий от anonymous

Транспорт только один, пересаживаться никуда не надо (возить не человеков собираемся ))) А в какую часть проги запихивать это расписание?

anonymous
()
Ответ на: комментарий от anonymous

> Наикратчайший путь между двумя узлами - отрезок на прямой, проложенный через два эти узла. Из каждого узла у нас выходят несколько дорог с разным временем передвижения по ним. Можно выделить дороги, наиболее подходящие для движения, сравнивая время движения по ним (длину) и угол отклонения от нормали (простая геометрия)

не нужно изобретать велосипед. алгоритм A-star специально разработан для этого -- в нем геометрические соображения закладываются в эвристику.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Дак то же функция оценки пути для алгоритма A* :)

anonymous
()
Ответ на: комментарий от anonymous

> Транспорт только один, пересаживаться никуда не надо (возить не человеков собираемся ))) А в какую часть проги запихивать это расписание?

В прогу записывать не расписание, а его обработку (на этапе построения графа). Расписание пихать в базу данных.

anonymous
()
Ответ на: комментарий от dilmah

Да и вообще, A* (в оригинальном понимании) хорошо служит для нахождения пути в двумерном грубокординированном пространстве (разделённом на клетки), на которе конечно можно наложить граф, но это извратно. Я думаю легче нагорбить свой алгоритм.

По графам передвижение несколько другое будет, тем более, что нужно учитывать не просто количество узлов ("кратчайший путь" в оригинальном понимании) но и длину связей.

anonymous
()
Ответ на: комментарий от anonymous

> угу, а как тогда обращаться к этой базе?

Зависит от реализации самой базы данных, наличия системы управления базой данных, реализации языка, наличия библиотек. Если религия запрещает пользоваться сторонней СУБД, то можно реализовать свою хоть на текстовых файлах.

anonymous
()

Не очень понятны условия задачи.

http://www.google.ru/search?q=site:www.intuit.ru+поиск+пути

> Интересует другой вариант: использовать теорию графов, реализуемую на делфи?

Поиск пути по карте - моя лаба по робототехнике.

В интернете исходников для мелких статических карт на делфи навалом.

Соответственно если >движение перекрыто<, надо просто отметить конкретное место перекрытия на карте как непроходимое.

p.s. В целом на диплом это не тянет. Максимум - слабенькая курсовая.

//Анонимный Анонимус

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.