В информатике метод сокращения иерархий — это метод ускорения поиска кратчайшего пути в графе . Наиболее интуитивными приложениями являются автомобильные навигационные системы: пользователь хочет проехать из пункта в пункт максимально быстрым маршрутом. Оптимизированная здесь метрика — это время в пути. Перекрестки изображаются вершинами , соединяющие их участки дорог — ребрами . Веса ребер представляют собой время, необходимое для проезда по этому участку дороги. Путь от до представляет собой последовательность ребер (участков дороги); кратчайший путь — это путь с минимальной суммой весов ребер среди всех возможных путей. Кратчайший путь в графе можно вычислить с помощью алгоритма Дейкстры, но, учитывая, что дорожные сети состоят из десятков миллионов вершин, это непрактично. [1] Сокращение иерархий — это метод ускорения, оптимизированный для использования свойств графов, представляющих дорожные сети. [2] Ускорение достигается за счет создания ярлыков на этапе предварительной обработки, которые затем используются во время запроса кратчайшего пути для пропуска «неважных» вершин. [2] Это основано на наблюдении, что дорожные сети имеют высокую иерархию. Некоторые перекрестки, например развязки автомагистралей, «более важны» и находятся выше в иерархии, чем, например, перекресток, ведущий в тупик. Ярлыки можно использовать для сохранения заранее вычисленного расстояния между двумя важными перекрестками, чтобы алгоритму не приходилось учитывать полный путь между этими перекрестками во время запроса. Сжимающие иерархии не знают, какие дороги люди считают «важными» (например, автомагистрали), но им предоставляется граф в качестве входных данных, и они могут присваивать важность вершинам, используя эвристику.
Иерархии сокращения применяются не только к алгоритмам ускорения в автомобильных навигационных системах , но также в веб- планировании маршрутов , моделировании дорожного движения и оптимизации логистики. [3] [1] [4] Реализации алгоритма общедоступны как программное обеспечение с открытым исходным кодом . [5] [6] [7] [8] [9]
Алгоритм сокращенных иерархий (CH) представляет собой двухэтапный подход к задаче поиска кратчайшего пути, состоящий из этапа предварительной обработки и этапа запроса . Поскольку дорожные сети меняются довольно нечасто, можно использовать больше времени (от секунд до часов) для однократных предварительных вычислений, прежде чем можно будет ответить на запросы. Используя эти предварительно вычисленные данные, можно ответить на многие запросы, занимая очень мало времени (микросекунды). [1] [3] Для достижения такого ускорения CH полагаются на ярлыки. Ярлык соединяет две вершины , не смежные в исходном графе. Его вес ребра представляет собой сумму весов ребер на кратчайшем пути .
Рассмотрим два крупных города, соединенных автомагистралью. Между этими двумя городами имеется множество развязок, ведущих к небольшим деревням и пригородам. Большинство водителей хотят добраться из одного города в другой – возможно, в рамках более крупного маршрута – и не сворачивать на одном из съездов по пути. В графе, представляющем эту схему дороги, каждый перекресток представлен узлом, а между соседними перекрестками создаются ребра. Чтобы вычислить расстояние между этими двумя городами, алгоритм должен пройти все ребра на своем пути, суммируя их длину. Предварительное вычисление этого расстояния один раз и сохранение его в дополнительном ребре, созданном между двумя крупными городами, позволит экономить вычисления каждый раз, когда это шоссе необходимо будет оценить в запросе. Это дополнительное преимущество называется «ярлыком» и не имеет аналогов в реальном мире. Алгоритм сокращения иерархий не знает типов дорог, но может определить, какие ярлыки необходимо создать, используя только граф в качестве входных данных.
Алгоритм CH использует ярлыки, созданные на этапе предварительной обработки, чтобы уменьшить пространство поиска — то есть количество вершин, которые CH должен просмотреть во время запроса. Для этого выполняются итеративные сокращения вершин. При сжатии вершины она временно удаляется из графа , и между каждой парой соседних вершин создается ярлык, если кратчайший путь от до содержит . [2] Процесс определения наличия кратчайшего пути между и называется поиском свидетеля. Это можно выполнить, например, вычислив путь от до с использованием прямого поиска, используя только еще не сжатые узлы. [3]
Вершины входного графа должны быть сжаты таким образом, чтобы минимизировать количество ребер, добавляемых в граф в результате сжатия. Поскольку оптимальный порядок узлов является NP-полным , используются [10] эвристики . [2]
Существуют эвристики «снизу вверх» и «сверху вниз» . С одной стороны, более дешевая в вычислительном отношении эвристика «снизу вверх» определяет порядок, в котором жадно сжимать вершины ; это означает, что порядок заранее не известен, а следующий узел выбирается для сжатия после завершения предыдущего сжатия. С другой стороны, нисходящая эвристика предварительно рассчитывает порядок всего узла до того, как первый узел будет сокращен. Это дает лучшие результаты, но требует больше времени на предварительную обработку. [2]
В восходящей эвристике для выбора следующей вершины для сжатия используется комбинация факторов. Поскольку количество ярлыков является основным фактором, определяющим время предварительной обработки и выполнения запроса, мы хотим, чтобы оно было как можно меньшим. Таким образом, наиболее важным условием для выбора следующего узла для сжатия является чистое количество ребер, добавленных при сжатии узла . Это определяется как где - количество ярлыков, которые были бы созданы, если бы их нужно было сжать, и - количество ребер, инцидентных . Используя только этот критерий, линейный путь приведет к линейной иерархии (много уровней ) и отсутствию ярлыков. Учитывая количество соседних вершин, которые уже сжаты, достигается равномерное сжатие и плоская иерархия (меньше уровней). Это можно, например, сделать, поддерживая счетчик для каждого узла, который увеличивается каждый раз, когда сжимается соседняя вершина. Узлы с меньшими счетчиками в этом случае предпочтительнее узлов с более высокими счетчиками. [11]
С другой стороны, нисходящая эвристика дает лучшие результаты, но требует больше времени на предварительную обработку. Они классифицируют вершины, являющиеся частью многих кратчайших путей, как более важные, чем те, которые необходимы только для нескольких кратчайших путей. Это можно аппроксимировать с помощью вложенных разрезов . [2] Чтобы вычислить вложенное разбиение, граф рекурсивно разделяется на две части, которые затем разделяются на две части и так далее. То есть найти подмножество узлов , которые при удалении из графа разделяются на две непересекающиеся части примерно одинакового размера, такие что . Поместите все узлы последними в порядке расположения узлов, а затем рекурсивно вычислите вложенное разделение для и , [12] интуитивно понятно, что все запросы от одной половины графа к другой половине графа должны проходить через небольшой разделитель и, следовательно, узлы в этом сепараторе имеют большое значение. Вложенные разрезы можно эффективно рассчитывать на дорожных сетях благодаря небольшим разделителям. [13]
На этапе запроса выполняется двунаправленный поиск, начиная с начального узла и целевого узла исходного графа, дополненный ярлыками, созданными на этапе предварительной обработки. [2] Наиболее важной вершиной на кратчайшем пути между и будет либо либо сама по себе, либо более важная, чем обе и . Следовательно, минимизация вершин находится на кратчайшем пути в исходном графе и выполняется. [2] Это, в сочетании с тем, как создаются ярлыки, означает, что как для прямого, так и для обратного поиска необходимо только ослабить края, ведущие к более важным узлам (вверх) в иерархии, что сохраняет пространство поиска небольшим. [3] Во всех путях вверх-(вниз-вверх)-вниз внутренний (вниз-вверх) можно пропустить, поскольку на этапе предварительной обработки создан ярлык.
Запрос CH, как описано выше, выдает время или расстояние от до, но не фактический путь. Чтобы получить список ребер (дорог) кратчайшего пути, необходимо распаковать полученные ярлыки. Каждый ярлык представляет собой объединение двух ребер: либо двух ребер исходного графа, либо двух ярлыков, либо одного исходного ребра и одного ярлыка. Сохранение средней вершины каждого ярлыка во время сжатия позволяет рекурсивно распаковывать кратчайший маршрут в линейном времени. [2] [3]
Если веса ребер изменяются чаще, чем топология сети, CH можно расширить до трехэтапного подхода, включив этап настройки между этапом предварительной обработки и этапом запроса. Это можно использовать, например, для переключения между кратчайшим расстоянием и кратчайшим временем или включать текущую информацию о дорожном движении, а также предпочтения пользователя, например, избегать определенных типов дорог (паромы, автомагистрали и т. д.). На этапе предварительной обработки большая часть времени выполнения тратится на вычисление порядка сжатия узлов. [3] Эту последовательность операций сжатия на этапе предварительной обработки можно сохранить на тот случай, если они понадобятся позже на этапе настройки. Каждый раз, когда метрика настраивается, сокращения можно эффективно применять в сохраненном порядке с использованием пользовательской метрики. [2] Кроме того, в зависимости от новых весов ребер может потребоваться перерасчет некоторых сокращений. [3] Чтобы это работало, порядок сжатия должен быть вычислен с использованием независимых от метрики вложенных разрезов. [1]
CH, как описано выше, ищут кратчайший путь от одного начального узла до одного целевого узла. Это называется кратчайшим путем «один к одному» и используется, например, в системах автомобильной навигации. Другие приложения включают сопоставление GPS- треков с сегментами дороги и симуляторы ускорения дорожного движения , которые должны учитывать вероятные маршруты, выбранные всеми водителями в сети. При прогнозировании маршрута пытаются оценить, куда, скорее всего, направляется транспортное средство, вычисляя, насколько хорошо его текущие и прошлые положения совпадают с кратчайшим путем от начальной точки до любой возможной цели. Это можно эффективно сделать с помощью CH. [2]
В сценариях «один ко многим» задаются начальный узел и набор целевых узлов, и необходимо вычислить расстояние для всех . Наиболее известным применением запросов «один ко многим» является поиск по интересующим объектам. Типичные примеры включают поиск ближайшей заправочной станции, ресторана или почтового отделения с использованием фактического времени в пути, а не географического расстояния в качестве показателя. [2]
В сценарии кратчайшего пути «многие ко многим» задан набор начальных узлов и набор целевых узлов, и необходимо вычислить расстояние для всех . Это используется, например, в логистических приложениях. [2] CH можно расширить до запросов «многие ко многим» следующим образом. Сначала выполните обратный поиск вверх от каждого файла . Каждая вершина, просканированная во время этого поиска, сохраняется в корзине . Затем выполняется прямой поиск вверх от каждого , проверяя для каждого непустого сегмента, улучшает ли маршрут через соответствующую вершину какое-либо наилучшее расстояние. То есть, если для любого . [2] [3]
Некоторые приложения даже требуют вычислений «один ко всем» , т. е. определения расстояний от исходной вершины до всех остальных вершин графа. Поскольку алгоритм Дейкстры посещает каждое ребро ровно один раз и, следовательно, работает за линейное время, он теоретически оптимален. Однако алгоритм Дейкстры трудно распараллелить, и он неоптимален для кэша из-за плохой локальности. CH можно использовать для более оптимальной реализации кеш-памяти. Для этого выполняется поиск вперед вверх с последующим сканированием вниз по всем узлам графа, обогащенного ярлыками. Более поздняя операция сканирует память линейным образом, поскольку узлы обрабатываются в порядке убывания важности и, следовательно, могут быть помещены в память соответствующим образом. [14] Обратите внимание, что это возможно, поскольку порядок, в котором узлы обрабатываются на втором этапе, не зависит от исходного узла . [2]
В производстве системы автомобильной навигации должны иметь возможность рассчитывать самые быстрые маршруты движения, используя прогнозируемую информацию о дорожном движении, и отображать альтернативные маршруты. И то, и другое можно сделать с помощью CH. [2] Первый вариант называется маршрутизацией в сетях, зависящих от времени, где время прохождения данного ребра больше не является постоянным, а скорее является функцией времени суток при входе в ребро. Альтернативные маршруты должны быть гладкими, значительно отличаться от кратчайшего пути, но не значительно длиннее. [2]
CH можно расширить для одновременной оптимизации нескольких показателей; это называется многокритериальным планированием маршрута. Например, можно минимизировать как стоимость, так и время поездки. Другим примером являются электромобили , у которых доступный заряд аккумулятора ограничивает допустимые маршруты, поскольку аккумулятор может не разряжаться. [2]
Был установлен ряд ограничений на производительность предварительной обработки и запросов сокращающихся иерархий. Далее пусть будет число вершин в графе, количество ребер, размерность шоссе , диаметр графа, глубина дерева и ширина дерева .
Первый анализ эффективности иерархии сокращений частично опирается на величину, известную как размерность шоссе . Хотя определение этой величины является техническим, интуитивно граф имеет небольшую размерность шоссе, если для каждого существует разреженный набор вершин, такой что каждый кратчайший путь длиной больше включает вершину из . Вычисление точного значения размера шоссе является NP-сложным [15] [16] и, скорее всего, W[1]-сложным [17] , но для сеток известно, что размерность шоссе равна . [18]
Альтернативный анализ был представлен в направлении работы «Настраиваемая иерархия сокращений». Время выполнения запроса может быть ограничено . Поскольку глубина дерева может быть ограничена шириной дерева, это также допустимая верхняя граница. Основным источником является [19], но последствия для времени работы в худшем случае более подробно описаны в [20] .