Как найти кратчайший путь в многопутевом графе - PullRequest
0 голосов
/ 21 октября 2019

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

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

Пример: Пример с 5 вершинами и 2 маршрутами

В этом примере есть 5 вершин: синий, черный, фиолетовый, оранжевый, зеленый. Первый маршрут: синий, черный, зеленый, фиолетовый, оранжевый (зеленая линия). Второй маршрут: зеленый, оранжевый, черный, фиолетовый. , Синий (черная линия)

минимальное количество итераций: 5

1-й маршрут: синий, черный, зеленый, ожидание, фиолетовый, оранжевый (зеленая линия)

2-й маршрут: зеленый, оранжевый, черный, фиолетовый, синий, ожидание (черная линия)

В этом примере первая машина ожидает на итерации № 4, чтобы запретить столкновение со второй машиной на вершине Фиолетового,

1 Ответ

1 голос
/ 21 октября 2019

Вы можете использовать алгоритм A * . В проблеме, которую решает этот алгоритм, узел будет представлять возможное состояние всех автомобилей. Таким образом, начальный узел будет представлять начальное состояние автомобилей, а целевой узел - состояние, в котором все автомобили находятся в пункте назначения.

A * выбирает следующий узел n , свернув следующую функцию:

f (n) = g (n) + h (n)

Если нет возможных коллизий, будет только один узел n для добавления в коллекцию узлов для рассмотрения, но если есть столкновение, чтобы избежать, будут варианты (т.е. разные узлы) на выбор, каждый раз с другим набором автомобилей, которые должны ждать.

g (n) - номер итерации для этого конкретного узла. Важно понимать, что во время этого алгоритма набор рассматриваемых узлов может не все находиться в одной и той же итерации.

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

Как всегда с A *, вам нужна очередь с приоритетами (например, minкуча) для хранения узлов. Он начинается только с начального узла. Затем каждый соседний узел (следующая итерация) генерируется из него и помещается в кучу. Как указывалось ранее, если нет коллизий, существует только один соседний узел для отправки. Однако, если тривиальное движение каждого автомобиля приведет к одному или нескольким столкновениям, несколько соседей могут быть рассмотрены и перенесены в кучу. Затем узел извлекается из кучи, и процесс продолжается.

Когда узел помещается в кучу, к нему должна быть добавлена ​​одна дополнительная информация: количество итераций, чтобы добраться до этого узла. Это значение g (n) для этого узла. Когда узел назначения достигнут, решение будет возвращено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...