Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпора по САОД.docx
Скачиваний:
40
Добавлен:
28.05.2022
Размер:
1.32 Mб
Скачать
  1. Алгоритмы поиска путей. Беллмана-Форда

Алгоритм Беллмана-Форда - это алгоритм поиска кратчайшего пути. Он работает как с положительными так и с отрицательными весами.

Алгоритм:

  1. Необходимо рассмотреть все пути в которых содержатся 0 рёбер, поэтому нужно записать в матрицу весов 0 в ячейку соответствующую вершине из которой мы начинаем движение(на пересечении с собой же). Остальные оставляем пустыми, т.к. мы до них дойти не можем

  2. Далее, необходимо рассмотреть все пути в которых не более 1 ребра. Заносим в матрицу длины рёбер между начальной точкой и точками до которых 1 ребро. Также нужно ставить ссылку на то, откуда мы пришли в конкретной вершине

  3. Затем где не более двух рёбер

  4. Повторяем пока не дойдем до максимального количества рёбер.

  1. Алгоритмы поиска путей. Волновой(Ли)

Волновой алгоритм - это алгоритм поиска кратчайшего пути.

Алгоритм:

  1. Помечаем вершину из которой будем двигаться нулём.

  2. Все вершины, которые соединены с начальной вершиной помечаются единицей.

  3. У каждой вершины к смежным вершинам ставим индексы на один больше. Не забываем помечать вершины как те, которые мы уже брали, чтобы больше к ним не обращаться.

  4. Повторяем шаг 3 пока не пройдем все вершины.

Чтобы найти кратчайший путь нужно взять конечную точку и вычитать каждый раз единицу из пометки вершины. Таким образом повторяя эту процедуру мы дойдем до верхней точки попутно записывая последовательность вершин. Нюанс: если попадутся две вершины с одинаковой пометкой то выбираем любую.

  1. Алгоритмы поиска путей. Лучевой

Лучевой поиск использует поиск в ширину.

Алгоритм:

  1. Нужно создать 2 пустых списка открытых и закрытых вершин.

  2. Выбрать первую вершину и занести ее в список открытых вершин

  3. Выбрать первую вершину из списка открытых вершин, занести ее в список закрытых.

  4. Далее всех “соседей” этой вершины тоже занести в список открытых, также записать информацию о предыдущей вершине. Если ни одна из этих вершин не является конечной повторяем пункт 3 и 4.

Чтобы найти путь нужно подняться вверх по графу.

Это жадный алгоритм который стремится в сторону конца в надежде что это окажется наименьшим путем.

  1. Алгоритмы поиска путей. A*

Посетив одну конкретную вершину, алгоритм «A Star» перед переходом к следующей исследует все соседние вершины. Все вершины алгоритм разделяет на 3 категории:

  1. Неизвестные вершины. Это те, которые не были еще посещены и пока что даже не найдены

  2. Известные вершины. Это те вершины, о которых уже известно алгоритму и уже известен путь к ним. Такие вершины сохраняются в «списке алгоритма» и становятся в очередь для их посещения и исследования. Из этого списка исследуются те вершины, которые считаются наиболее перспективными.

  3. Исследованные вершины. В эту категорию попадают те вершины, которые уже были посещены. К этим вершинам известен самый короткий путь, поэтому они попадают в «закрытый список» — этот список нужен для того, чтобы исключить многократное исследование одних и тех же вершин.

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

Алгоритм «A Star» завершает свою работу только в том случае, если конечная вершина переносится в категорию «исследованные вершины». В этом случае уже будет весь список исследованных вершин, а на каждой из них будет стоять указатель с кратчайшим путем. Поэтому несложно будет по указателям отследить кратчайший путь от конечной вершины до начальной.

Алгоритм «A Star» находит кратчайший путь между вершинами, основываясь на стоимости и «весе» ребер. Поэтому путь, который находит «A Star», можно по праву назвать «самым быстрым» или «самым простым». По этой причине алгоритм «A Star» очень часто применяется как раз для планирования кратчайших путей, однако его также часто применяют в играх.

Говоря простым языком, алгоритм А* находит оптимальный вариант благодаря вычислению суммарной стоимости всех путей между начальной и конечной точкой. Кстати, этот способ быстрее алгоритма Дейкстры благодаря эвристической функции.

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

f(n): общая стоимость пути

g(n): стоимость пути между текущей и начальной вершиной

h(n): эвристическая функция

тут расписано хорошо:

https://medium.com/nuances-of-programming/%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC-%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0-a-3bb59be05a79

Программа использует алгоритм А*, который пошагово просматривает все пути, ведущие от начальной вершины в конечную, пока не найдёт минимальный. Как и все информированные алгоритмы поиска, он просматривает сначала те маршруты, которые «кажутся» ведущими к цели. При выборе вершины он учитывает весь пройденный до неё путь.

В начале работы просматриваются узлы, смежные с начальным; выбирается тот из них, который имеет минимальное значение, после чего этот узел раскрывается. На каждом этапе алгоритм оперирует с множеством путей из начальной точки до всех ещё не раскрытых вершин графа — множеством частных решений, — которое размещается в очереди с приоритетом. Приоритет пути определяется по значению. Алгоритм продолжает свою работу до тех пор, пока значение целевой вершины не окажется меньшим, чем любое значение в очереди, либо пока всё дерево не будет просмотрено. Из множества решений выбирается решение с наименьшей стоимостью.