кратчайший путь (не понимаю при чём тут он?)

Модератор: Модераторы разделов

Аватара пользователя
Mifodix
Сообщения: 373
ОС: Fedora 17 x86_64

кратчайший путь

Сообщение Mifodix »

Здравствуйте, уважаемые форумчане!
Попалась задача на нахождение кратчайшего пути в графах.
Есть множество задач T1, T2, …, Tn, для выполнения которых необходимо время t1, t2, …, tn соответственно, и множество отношений вида «задача Ti должна закончиться до начала задачи Tj». Найти минимальное время, необходимое для выполнения всех задач.
Дополнительные указания: начало и конец задач – вершины графа, продолжительность задач – нагруженные дуги. Граф представлен матрицой смежности. Воспользоваться алгоритмом нахождения кратчайшего пути

Вопрос в том, что где же тут взять кратчайший путь, если требуется выполнение всех задач? Может кто-нибудь придумать подходящий пример?
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: кратчайший путь

Сообщение AestheteAnimus »

Mifodix писал(а):
02.01.2009 23:13
Здравствуйте, уважаемые форумчане!
Попалась задача на нахождение кратчайшего пути в графах.
...
Вопрос в том, что где же тут взять кратчайший путь, если требуется выполнение всех задач? Может кто-нибудь придумать подходящий пример?

Потому что это ориентированный взвешенный граф (погуглите это определение ;) ). Задачи - узлы, очередность задач определяет направление ребер, а время - их веса. Для затравки можно глянуть вот это http://ru.wikipedia.org/wiki/Алгоритм_Флой...#8212;_Уоршелла
Спасибо сказали:
Аватара пользователя
Mifodix
Сообщения: 373
ОС: Fedora 17 x86_64

Re: кратчайший путь

Сообщение Mifodix »

наверное, эт я после праздников туплю:) найду я минимальное "расстояние" между всеми вершинами с помощью алгоритма Флойда, затем выберу минимальное среди них + то, которое с обходом всех вершин ( стек посещённых вершин присобачить?)
Спасибо сказали:
Аватара пользователя
AestheteAnimus
Сообщения: 135
ОС: FreeBSD 8.0-RELEASE amd64

Re: кратчайший путь

Сообщение AestheteAnimus »

Mifodix писал(а):
03.01.2009 01:28
наверное, эт я после праздников туплю:) найду я минимальное "расстояние" между всеми вершинами с помощью алгоритма Флойда, затем выберу минимальное среди них + то, которое с обходом всех вершин ( стек посещённых вершин присобачить?)

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

UPD:
Совсем туплю... http://ru.wikipedia.org/wiki/Задача_коммивояжёра
Спасибо сказали:
Аватара пользователя
Mifodix
Сообщения: 373
ОС: Fedora 17 x86_64

Re: кратчайший путь

Сообщение Mifodix »

оооо, вот это уже намного теплее:))


эххх, где б в сети найти алгоритм самой простой реализации?
Спасибо сказали:
Аватара пользователя
Mifodix
Сообщения: 373
ОС: Fedora 17 x86_64

Re: кратчайший путь

Сообщение Mifodix »

и всё-таки это не задача коммивояжёра:)
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: кратчайший путь

Сообщение NickLion »

Вроде в тупую так:
1. Строим граф, как и было сказано - вершины - начала и концы задач, продолжительность задачи - взвешенная дуга, вес - продолжительность задачи. Условия задача i должна закончиться раньше начала j - дуга из конца i в начало j с весом 0.
2. Добавляем вершину в которую проводим дуги из всех окончаний с весом 0.
3. Делаем поиск в глубину, но без пометок, из этой вершины по обратным ребрам. При достижении листа смотрим сколько времени понадобилось,выбираем максимум. Если попадаем в обрабатываемую вершину - значит данный граф топологически не отсортировать, и решения нет (например - задача 1 требует 2, а 2 требует 1).
4. Найденный максимум и есть ответ.
Если прооптимизировать, то:
* 3. Поиск с отметками пройденного, для каждой вершины хранить время ее доступа и сколько до максимального листа (заполняем при выходе). При попадании в пройденную вершину - сравнить время доступа до и после, если новое время больше - посчитать новое время для максимального листа, обновить инфо только для этой вершины и сравнить с текущим максимальным временем.
Сложность оптимизированного алгоритма: O(V^2).
Поиск кратчайшего (точнее наибольшего) пути:
Дейкстру тут не получится применить, можно применить Беллмана-Форда, с обратной релаксацией... только в случае реализации графа матрицей смежности сложность будет O(V*E)=O(V^3).
...........вроде так :)
Спасибо сказали:
Аватара пользователя
Mifodix
Сообщения: 373
ОС: Fedora 17 x86_64

Re: кратчайший путь

Сообщение Mifodix »

Ближе всех был NickLion :) Задача свелась к нахождению наиболее длинного пути в ациклическом графе. Превосходный алогритм решения этой задачи нашёл в книге Седжвика "Фундаментальные алгоритмы", посвящённую алгоритмам для графов. Рекомендую эту книгу:) Автор назвал задачу календарным планированием. Так как в Сети я так и не смог найти нормального алгоритма, зато нашёл толпу народа, ищущую алгоритм решения такой задачи, то в аттач выкладываю мою более-менее простую реализацию на с++ без использования классов и с подробными комментариями. Само описание алгоритма ищите в вышеуказанной книге. В архиве также файл тестового примера, основанный на данных графа из "Фундаментальных алгоритмов". Надеюсь, что эта реализация кому-нибудь пригодится:)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали: