0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>В этом уроке мы рассмотрим поиск самого дешевого пути между двумя вершинами на взвешенном графе. Часто это называют поиском кратчайшего пути в графе. Самый популярный метод для этого - алгоритм Дейкстры.</p>
1
<p>В этом уроке мы рассмотрим поиск самого дешевого пути между двумя вершинами на взвешенном графе. Часто это называют поиском кратчайшего пути в графе. Самый популярный метод для этого - алгоритм Дейкстры.</p>
2
<h2>Что такое Алгоритм Дейкстры и как он работает</h2>
2
<h2>Что такое Алгоритм Дейкстры и как он работает</h2>
3
<p>Алгоритм Дейкстры находит кратчайшие пути между всеми вершинами графа и их длину. Он используется в ряде реальных приложений, таких как маршрутизация сетевых пакетов.</p>
3
<p>Алгоритм Дейкстры находит кратчайшие пути между всеми вершинами графа и их длину. Он используется в ряде реальных приложений, таких как маршрутизация сетевых пакетов.</p>
4
<p>Разберем, как он работает. Предположим, начальная вершина называется a. Алгоритм помечает вершину v двумя параметрами:</p>
4
<p>Разберем, как он работает. Предположим, начальная вершина называется a. Алгоритм помечает вершину v двумя параметрами:</p>
5
<ul><li><strong>Стоимость</strong>- это текущее кратчайшее известное расстояние от a</li>
5
<ul><li><strong>Стоимость</strong>- это текущее кратчайшее известное расстояние от a</li>
6
<li><strong>Вершина</strong>- это сосед v на пути от a до v, который дает это кратчайшее известное расстояние</li>
6
<li><strong>Вершина</strong>- это сосед v на пути от a до v, который дает это кратчайшее известное расстояние</li>
7
</ul><p>С помощью алгоритма Дейкстры можно постоянно улучшать стоимость по мере нахождения лучших путей к v. Для этого нужно работать в следующем порядке:</p>
7
</ul><p>С помощью алгоритма Дейкстры можно постоянно улучшать стоимость по мере нахождения лучших путей к v. Для этого нужно работать в следующем порядке:</p>
8
<p><strong>Шаг 1.</strong>Устанавливаем метки стоимости каждого соседа a на стоимость ребра от a до него и метку вершины на a. Помечаем a как искомое. Эта метка будет означать, что мы не будем посещать ее снова.</p>
8
<p><strong>Шаг 1.</strong>Устанавливаем метки стоимости каждого соседа a на стоимость ребра от a до него и метку вершины на a. Помечаем a как искомое. Эта метка будет означать, что мы не будем посещать ее снова.</p>
9
<p><strong>Шаг 2.</strong>Выбираем помеченную вершину v с наименьшей стоимостью и развиваем связи по своему усмотрению. Смотрим каждого соседа v. Если сосед не помечен, то мы помечаем его стоимостью c плюс вес ребра к нему от v. Его вершинной меткой становится v.</p>
9
<p><strong>Шаг 2.</strong>Выбираем помеченную вершину v с наименьшей стоимостью и развиваем связи по своему усмотрению. Смотрим каждого соседа v. Если сосед не помечен, то мы помечаем его стоимостью c плюс вес ребра к нему от v. Его вершинной меткой становится v.</p>
10
<p>Если сосед уже помечен, то мы сравниваем его текущую стоимость метки с c плюс вес ребра к нему от v. Если это не лучше, чем текущая стоимость метки соседа, то мы больше ничего не делаем с этой вершиной. В противном случае мы обновляем стоимость метки на эту новую стоимость и обновляем метку соседней вершины на v. Мы повторяем это для каждого незамеченного соседа v и затем помечаем саму v как искомую.</p>
10
<p>Если сосед уже помечен, то мы сравниваем его текущую стоимость метки с c плюс вес ребра к нему от v. Если это не лучше, чем текущая стоимость метки соседа, то мы больше ничего не делаем с этой вершиной. В противном случае мы обновляем стоимость метки на эту новую стоимость и обновляем метку соседней вершины на v. Мы повторяем это для каждого незамеченного соседа v и затем помечаем саму v как искомую.</p>
11
<p><strong>Шаг 3.</strong>Продолжаем на каждом шаге выбирать немаркированную вершину с наименьшей стоимостью и обновлять метки ее соседей, как на втором шаге.</p>
11
<p><strong>Шаг 3.</strong>Продолжаем на каждом шаге выбирать немаркированную вершину с наименьшей стоимостью и обновлять метки ее соседей, как на втором шаге.</p>
12
<p><strong>Шаг 4.</strong>Завершаем алгоритм, когда вершина с наименьшей стоимостью является вершиной назначения. Эта стоимость - общая стоимость кратчайшего пути. Затем мы используем метки вершин для поиска пути от начала до места назначения.</p>
12
<p><strong>Шаг 4.</strong>Завершаем алгоритм, когда вершина с наименьшей стоимостью является вершиной назначения. Эта стоимость - общая стоимость кратчайшего пути. Затем мы используем метки вершин для поиска пути от начала до места назначения.</p>
13
<p>Рассмотрим работу алгоритма на примере, чтобы лучше понять весь его процесс.</p>
13
<p>Рассмотрим работу алгоритма на примере, чтобы лучше понять весь его процесс.</p>
14
<h2>Как работает алгоритм Дейкстры на примере</h2>
14
<h2>Как работает алгоритм Дейкстры на примере</h2>
15
<p>Чтобы увидеть, как работает алгоритм Дейкстры, рассмотрим пример ниже. В нем мы ищем кратчайший путь из вершины a в вершину g:</p>
15
<p>Чтобы увидеть, как работает алгоритм Дейкстры, рассмотрим пример ниже. В нем мы ищем кратчайший путь из вершины a в вершину g:</p>
16
<p><strong>Шаг 1.</strong>Мы начинаем с вершины a, посещаем каждую из соседних вершин и помечаем их стоимостью от a, вместе с a. Так мы обозначаем, что нашли их через вершину a. Затем мы помечаем a как искомое (серым цветом), что означает, что мы больше не будем его посещать.</p>
16
<p><strong>Шаг 1.</strong>Мы начинаем с вершины a, посещаем каждую из соседних вершин и помечаем их стоимостью от a, вместе с a. Так мы обозначаем, что нашли их через вершину a. Затем мы помечаем a как искомое (серым цветом), что означает, что мы больше не будем его посещать.</p>
17
<p><strong>Шаг 2.</strong>Далее мы выбираем соседа a, которого пометили наименьшей стоимостью - вершина b. Посещаем ее соседей.</p>
17
<p><strong>Шаг 2.</strong>Далее мы выбираем соседа a, которого пометили наименьшей стоимостью - вершина b. Посещаем ее соседей.</p>
18
<p>Мы можем добраться до b из a с общей стоимостью 1. Поскольку добраться из b в e стоит 1, мы помечаем e как (2, b). Получается, что мы можем добраться из a в e с общей стоимостью 2. При этом b указывает, что мы добрались до e через вершину b.</p>
18
<p>Мы можем добраться до b из a с общей стоимостью 1. Поскольку добраться из b в e стоит 1, мы помечаем e как (2, b). Получается, что мы можем добраться из a в e с общей стоимостью 2. При этом b указывает, что мы добрались до e через вершину b.</p>
19
<p><strong>Шаг 3.</strong>Еще мы можем добраться до вершины d с общей стоимостью 3, пройдя через b. Вершину d уже пометили, но наш маршрут через b дешевле, поэтому мы заменим метку на d на (3, b). Если бы путь к d через b был дороже, мы бы не меняли метку на d. Также мы игнорируем ребро от b обратно к a, так как a было помечено как искомое. И теперь, когда мы закончили с b, мы помечаем его как искомый.</p>
19
<p><strong>Шаг 3.</strong>Еще мы можем добраться до вершины d с общей стоимостью 3, пройдя через b. Вершину d уже пометили, но наш маршрут через b дешевле, поэтому мы заменим метку на d на (3, b). Если бы путь к d через b был дороже, мы бы не меняли метку на d. Также мы игнорируем ребро от b обратно к a, так как a было помечено как искомое. И теперь, когда мы закончили с b, мы помечаем его как искомый.</p>
20
<p><strong>Шаг 4.</strong>Продолжаем этот процесс для других вершин графа. Всегда выбирайте ту, которую пометили с наименьшей суммарной стоимостью. Она будет помеченной, но не отмеченной как посещенная.</p>
20
<p><strong>Шаг 4.</strong>Продолжаем этот процесс для других вершин графа. Всегда выбирайте ту, которую пометили с наименьшей суммарной стоимостью. Она будет помеченной, но не отмеченной как посещенная.</p>
21
<p>Следующей вершиной для посещения будет e, так как ее общая стоимость на данный момент равна 2, что дешевле, чем у любой другой помеченной вершины. После еще нескольких шагов мы приходим к тому, что g - самая дешевая помеченная вершина. Это наша точка остановки.</p>
21
<p>Следующей вершиной для посещения будет e, так как ее общая стоимость на данный момент равна 2, что дешевле, чем у любой другой помеченной вершины. После еще нескольких шагов мы приходим к тому, что g - самая дешевая помеченная вершина. Это наша точка остановки.</p>
22
<p>Как только вершина нашей цели имеет самую дешевую метку, никакой другой маршрут к этой цели не может быть лучше, чем тот, который мы имеем. Поэтому мы останавливаемся на этой точке, и необязательно исследовать остальные пути.</p>
22
<p>Как только вершина нашей цели имеет самую дешевую метку, никакой другой маршрут к этой цели не может быть лучше, чем тот, который мы имеем. Поэтому мы останавливаемся на этой точке, и необязательно исследовать остальные пути.</p>
23
<p>Затем мы используем эти метки, чтобы проследить обратный путь. Например, в конце вершину g пометили меткой (6, f), поэтому мы прослеживаем путь назад от g к f. Вершина f пометили меткой (5, d), поэтому мы прослеживаем путь назад к d. Далее - к b и к a, что дает нам путь abd f g с общей длиной 6 как кратчайший путь.</p>
23
<p>Затем мы используем эти метки, чтобы проследить обратный путь. Например, в конце вершину g пометили меткой (6, f), поэтому мы прослеживаем путь назад от g к f. Вершина f пометили меткой (5, d), поэтому мы прослеживаем путь назад к d. Далее - к b и к a, что дает нам путь abd f g с общей длиной 6 как кратчайший путь.</p>
24
<h2>Выводы</h2>
24
<h2>Выводы</h2>
25
<p>Мы разобрали, что такое алгоритм Дейкстры, и как с его помощью находить кратчайшие пути. Еще он позволяет постоянно улучшать стоимость по мере нахождения лучших путей. Такой алгоритм часто используется в приложениях для маршрутизации сетевых пакетов.</p>
25
<p>Мы разобрали, что такое алгоритм Дейкстры, и как с его помощью находить кратчайшие пути. Еще он позволяет постоянно улучшать стоимость по мере нахождения лучших путей. Такой алгоритм часто используется в приложениях для маршрутизации сетевых пакетов.</p>