Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
коммивояжер мой редакт..doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
958.46 Кб
Скачать

1.6.3. Алгоритм Дейкстры.

В 1959 г. Голландский математик Дейкстра предложил алгоритм, который решает задачу коммивояжера для любой матрицы исходных данных: симметричной, несимметричной и смешанной (отсутствуют некоторые ребра графа).

Для алгоритма Дейкстры используется три массива чисел:

  1. Двухмерный массив D размером n n, содержащий веса ребер графа (расстояние между городами, стоимости проезда и т.д.);

  2. Одномерный массив А размером n, в котором свободные вершины отмечены 0, а номера просмотренных вершин записываются слева направо. В первый элемент массива А помещается номер стартовой вершины;

  3. Одномерный массив В размером n, который содержит вес ребра. Так, первый элемент массива В содержит вес ребра, вершины которого хранятся в первом и втором элементе массива А, второй элемент массива В содержит вес ребра, вершины которого хранятся во второй и третьей ячейках массива В и т.д. Сумма элементов массива В есть текущее значение формируемого маршрута ( ). По окончании работы алгоритма сумма элементов массива В будет соответствовать протяженности оптимального маршрута. Элементы массива В заполняются слева направо в порядке (последовательности) заполнения массива А.

Суть алгоритма Дейкстры состоит в том, что N раз (n равно количеству вершин графа) определяется ребро графа с минимальным весом (длиной пути) из оставшихся свободных вершин в текущей строке массива D. Далее выполняются две проверки:

  1. Длина пройденного ребра графа должна быть меньше или равна симметричному ребру графа. В противном случае выбирается симметричное ребро.

  2. Массив В заполнен на k элементов. Массив А заполнен на t элементов, причем t=k-1. Текущее ребро графа имеет индекс t. Если

(1)

то ранее найденная вершина k заменяется на текущую вершину t в массиве А, а в массиве В удаляется последнее значение и заменяется предпоследнее значение. В этой проверке отрабатывается принцип треугольника: ранее выбранный путь оказался длиннее текущего пути.

Таким образом, на каждом шаге просматриваются все вершины графа, а анализируются только свободные вершины.

Описание алгоритма Дейкстры

  1. Заполнить массив А: первому элементу присвоить номер стартовой вершины. Остальным элементам массива А присвоить значение 0.

  2. Заполним массив В нулями.

  3. Организовать перебор строк массива D.

  4. Определить номер текущей строки. Номер текущей строки равен номеру последнего элемента, помещенного в массив А.

  5. Просмотреть текущую строку массива D и выбрать элемент с минимальным значением из числа свободных элементов.

  6. Проверить выбранный элемент на выполнение принципа симметричности. При необходимости выполнить замену ребра.

  7. Проверить выбранный элемент на выполнение принципа треугольника. При необходимости сделать замену вершины.

  8. Все ли строки матрицы D просмотрены? Если нет, то перейти к пункту 4. Если да, то к пункту 9.

  9. Сформулировать и выдать ответ: структура маршрута и протяженность маршрута.

  10. Остановить работу алгоритма.

Решим пример, разобранный в прямом алгоритме, методом Дейкстры.

Задача: Определить длину (Д) кратчайшего маршрута (К) коммивояжера. Расстояния ( ) между шестью городами представлены в таблице 1.13. Граф для примера представлен на рисунке 1.12

Табл. 1.13

Город

1

2

3

4

5

6

1

6

4

12

14

22

2

6

3

8

7

20

3

4

3

10

11

18

4

12

8

10

9

16

5

44

7

11

9

10

6

22

20

18

16

10

Рис. 1.12. Граф-условие

Работа алгоритма Дейкстры показана на рисунке 1.13, где правая часть выражения (1) обозначена как .

Рис.1.13. Ход решения примера

(после каждого прохода показан конечный результат)

Ответ: длина маршрута 52, порядок объезда городов:

1 .

После прохода по шестой сроке оказалось, что нарушен принцип треугольника. В результате замены вершин (перестановка вершин 4 и 6) условие (3.1) выполняется.

Длина маршрута, найденного с помощью алгоритма Дейкстры, короче на 9 единиц, по сравнению с длиной маршрута (61), определенного прямым алгоритмом.