Skip to content

Instantly share code, notes, and snippets.

Created September 15, 2017 20:54
Show Gist options
  • Save anonymous/87d54c71f8f5ea336249d9dbed7303b3 to your computer and use it in GitHub Desktop.
Save anonymous/87d54c71f8f5ea336249d9dbed7303b3 to your computer and use it in GitHub Desktop.
Задачи на взвешенных графах

Задачи на взвешенных графах - Задачи о путях во взвешенных графах



Только полноправные пользователи могут оставлять комментарии. TM Feed Хабрахабр Geektimes Тостер Мой круг Фрилансим. Хабрахабр Публикации Пользователи Хабы Компании Песочница. Наверняка многим из гейм-девелоперов или просто людям, увлекающимися програмировагнием будет интересно услышать эти четыре важнейших алгоритма, решающих задачи о кратчайших путях. Сформулируем определения и задачу. Графом будем называть несколько точек вершин , некоторые пары которых соединены отрезками рёбрами. Граф связный, если от каждой вершины можно дойти до любой другой по этим отрезкам. Циклом назовём какой-то путь по рёбрам графа, начинающегося и заканчивающегося в одной и той же вершине. И ещё граф называется взвешенным, если каждому ребру соответствует какое-то число вес. Не может быть двух рёбер, соединяющих одни и те же вершины. Каждый из алгоритмов будет решать какую-то задачу о кратчайших путях на взвешенном связном. Кратчайший путь из одной вершины в другую — это такой путь по рёбрам, что сумма весов рёбер, по которым мы прошли будет минимальна. Для ясности приведу пример такой задачи в реальной жизни. Пусть, в стране есть несколько городов и дорог, соединяющих эти города. При этом у каждой дороги есть длина. Вы хотите попасть из одного города в другой, проехав как можно меньший путь. Считаем, что в графе n вершин и m рёбер. Пойдём от простого к сложному. Веса могут быть отрицательными, но у нас не может быть циклов с отрицательной суммой весов рёбер иначе мы можем ходить по нему сколько душе угодно и каждый раз уменьшать сумму, так не интересно. Для этого для каждой пары вершин просто попытаемся взять в качестве пересадочной i — 1-ую вершину, и если это улучшает ответ, то так и оставим. Аналогично предыдущему алгоритму, веса могут быть отрицательными, но у нас не может быть циклов с отрицательной суммой весов рёбер. Заведём массив d[0… n — 1], в котором на i-ой итерации будем хранить ответ на исходную задачу с ограничением на то, что в путь должно входить строго меньше i рёбер. В самом начале d заполнен Чтобы обновлять на i-ой итерации массив, надо просто пройти по каждому ребру и попробовать улучшить расстояние до вершин, которые оно соединяет. Кратчайшие пути не содержат циклов, так как все циклы неотрицательны, и мы можем убрать цикл из путя, при этом длина пути не ухудшится хочется также отметить, что именно так можно найти отрицательные циклы в графе: Поэтому длина кратчайшего пути не больше n — 1, значит, после n-ой итерации d будет ответом на задачу. На каждой итерации какие-то вершины будут помечены, а какие-то нет. Также поддерживается инвариант того, что для помеченных вершин длина, указанная в d, и есть ответ. На каждой итерации мы находим вершину, с наименьшим значением в d среди непомеченных, пусть это вершина v. Тогда значение d[v] является ответом для v. Возьмём первую встретившуюся непомеченную вершину на этом пути, назовём её u. Длина пройденной части пути от 0 до u — d[u]. Но тогда v не подходит под своё описание — у неё не наименьшее значение d[v] среди непомеченных. Теперь смело помечаем вершину v и пересчитываем d. Так делаем, пока все вершины не станут помеченными, и d не станет ответом на задачу. Что нам нужно в алгоритме Дейкстры? Нам нужно уметь находить по значению d минимальную вершину и уметь обновлять значение d в какой-то вершине. В классической реализации мы пользуемся простым массивом, находить минимальную по d вершину мы можем за порядка n операций, а обновлять — за 1 операцию. Воспользуемся двоичной кучей во многих объектно-ориентированных языках она встроена. Создадим массив d[0… n — 1] его значение то же самое, что и раньше и кучу q. В куче будем хранить пары из номера вершины v и d[v] сравниваться пары должны по d[v]. Также в куче могут быть фиктивные элементы. Так происходит, потому что значение d[v] обновляется, но мы не можем изменить его в куче. Поэтому в куче могут быть несколько элементов с одинаковым номером вершины, но с разным значением d но всего вершин в куче будет не более m, я гарантирую это. Когда мы берём минимальное значение в куче, надо проверить, является ли этот элемент фиктивным. Для этого достаточно сравнить значение d в куче и реальное его значение. А ещё для записи графа вместо двоичного массива используем массив списков. Анализ и проектирование систем авторов , публикаций. Программирование 2,9k авторов , 6,5k публикаций. Python авторов , 1,8k публикаций. Open source 1k авторов , 2,3k публикаций. Разработка игр 1,2k авторов , 2,9k публикаций. Разработка под Windows авторов , публикации. Математика авторов , 1,1k публикаций. Разработка под Android 1k авторов , 2,2k публикаций. Разработка мобильных приложений 1k авторов , 2,8k публикаций. JavaScript 1,9k авторов , 4,1k публикаций. Такси и Uber поедут вместе 10,2k Добавить в закладки Александр Мокин mokin карма. Интересно бы было почитать про возможности нахождения пути с использованием GPU. Когда я писал эту статью, я забыл упомянуть в заголовке, что я рассматриваю только взвешенные графы. Не вижу проблем его использовать для ребер разного веса. Вроде, зависит от реализации? Из той же статьи в википедии. Практическое применение Волновой алгоритм — один из основных при автоматизированной трассировке разводке печатных плат. Также одно из характерных применений волнового алгоритма — поиск кратчайшего расстояния на карте в стратегических играх. И да, как правильно заметили, то, что он ориентирован на ребра единичной длинны не мешает модифицировать его для прочих нужд. Почему бы для вашего псевдокода не использовать тег source? Спасибо за ваш совет, учту на будущее. К сожалению сейчас править слишком много. Сделать читабельнее четыре блока кода ради того, чтобы многократно повысить качество статьи? Простите, но сейчас, имхо, код выглядит как каша — без подсветки, с навязчивыми линиями слева и пропорциональным шрифтом. И, например, в стратегии, где надо пускать много юнитов по длинному пути выбрали пачку из юнитов и шлём на вражескую базу за речкой в другом конце карты в обычном виде будет страшно глючить. Я бы с удовольствием почитал об оптимизациях этих алгоритмов. Но всё-же хотелось бы почитать про готовые решения. И да, в дополнение — " Сравнение алгоритмов поиска маршрутов в StarCraft и StarCraft 2 ". Интересно, а какой алгоритм на какой основе показывает лучший результат? Имхо, тоже, но без оптимизации он слишком медлителен. Был пример на Флеше. Тут есть ещё одна дилемма для оптимизации — считать ли первый найденный маршрут самым коротким, или поискать более короткий? Если соблюдено некое условие для эвристической функции, то алгоритм всегда находит минимальный путь или один из минимальных. Условие звучит примерно так, что оценка не должна превышать минимально допустимый теоретический путь. Ну можно искать любой путь, а не самый короткий. Возможно, это будет быстрее, плюс велика вероятность таки нахождения самого короткого пути, но не факт. Базовый — не значит оптимальный или лучший. Базовый — это основной или простейший, на котором легко показать основные задачи алгоритма в целом. А как же симплекс-метод? Насколько я помню, этот алгоритм оптимизирует решения нескольких функций в многомерном пространстве обычно больше 2. Он слишком далёк от реального поиска пути. А если сделать одну функцию минимума и одну функцию оценки, и искать кратчайший путь по этим двум функциям? Транспортные задачи симплекс-метод решает на ура, самое длинное решение, которое я видел — 20 итераций. Хотя да, возможно, что составление матрицы потребует больше итераций, чем любой из приведенных алгоритмов. Действительно, в этой статье алгоритмы поиска в графе описаны в больше мере с математической точки зрения, нежели с точки зрения гейм-дева. Если же игра — интерактивная, то найденное решение требует дальнейшей обработки с учетом динамических коллизий, сглаживания и всего остального. Кстате, стоит упомянуть, что поиск на графе даже в гейм-деве не ограничивается картами. Это так же ИИ, планирование и многое другое. Кратчайшие пути не только в играх нужны. В связи есть целое направление по проектированию сетей связи с целью получить наиболее оптимальный вариант сети с заданной надёжностью. Разумеется, но в данном случае автор в самом начале статьи сослался на гейм-дев. Просто у меня был конспект лекций СибГУТИ в электронном виде набирал когда учился в odt , где вопросы построения сетей связи рассматриваются на уровне графов. Если интересует, могу поискать. Метки лучше разделять запятой. Интересные публикации Хабрахабр Geektimes. Разбираемся в физике частиц: Не дать печати выйти из-под контроля GT. Автоматическое освещение комнаты на базе контроллера Аrduino GT. Космический зонд Juno прислал детальные снимки Большого красного пятна Юпитера GT. Авторизация OAuth для Xamarin-приложений. А также готовый плагин для vuejs. В IBM создали новое поколение транзисторов из углеродных нанотрубок. Как сделать сложное простым. Разделы Публикации Хабы Компании Пользователи Песочница. Информация О сайте Правила Помощь Соглашение Конфиденциальность. Услуги Реклама Тарифы Контент Семинары.


Сахарная эпиляция рецепт
Бизнес план производство макаронных изделий
Решение задач с помощью графа
Какие лекарства при повышенном нижнем давлении
Сухие рукичто делать
Муж и жена целуются
Понятие политика возникновение наукио политике
Можно ли восстановить зрение без операции
Сколько уплотнительных колец на форсунки мазда мпв
Сшить берет девочке
Как сделать ресет программатор avrisp mkii
Складной стул из фанеры своими руками чертежи
Теория графов
Контакт компьютерная версия зайти
Управление образования бардымского муниципального района
Характеристики масла тотал кварц 5w30
Нормативы потребления электроэнергии квт ч на человека
Открытие частного детского сада бизнес план
Задача о кратчайшем пути
Схема простого измерителя esr сделай сам
Расчет результатов измерений
Где лечит протрузии
Как почистить обсадную трубу скважины
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment