Автор работы: Пользователь скрыл имя, 24 Марта 2012 в 20:42, курсовая работа
Комбинаторика – раздел математики, посвящённый решению задач выбора и расположения элементов некоторого, обычно конечного множества в соответствии с заданными правилами.
Каждое такое правило определяет способ построения некоторой конструкции из элементов исходного множества, называемой комбинаторной конфигурацией. Поэтому можно сказать, что целью комбинаторного анализа является изучение комбинаторных конфигураций.
если bk>bj+djk то (bk:=bj+djk; ck:=j) {Условие означает, что путь vi..vk длиннее, чем путь vi..vj,vk . Если все a[k] отмечены, то длина пути vi..vk равна b[k]. Теперь надо перечислить вершины, входящие в кратчайший путь}
3(выдача ответа).
{Путь vi..vk выдаётся в обратном порядке следующей процедурой:}
3.1. z:=c[k];
3.2. Выдать z;
3.3. z:=c[z]; Если z = 0, то конец, иначе перейти к 3.2.
Для выполнения алгоритма нужно n раз просмотреть массив b из n элементов, т. е. алгоритм Дейкстры имеет квадратичную сложность. Проиллюстрируем работу алгоритма Дейкстры численным примером (для большей сложности, считаем, что некоторые города (вершины) i,j не соединены между собой, т. е. D[i,j]=∞). Пусть, например, i=3. Требуется найти кратчайшие пути из вершины 3. Содержимое массивов a,b,c после выполнения первого пункта показано на табл. 12:
Очевидно, содержимое таблицы меняется по мере выполнения общего шага. Это видно из следующей таблицы:
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
a | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
b | 12 | 25 | 0 | 18 | ∞ | ∞ | ∞ | ∞ |
c | 3 | 3 | 0 | 3 | 3 | 3 | 3 | 3 |
табл. 13 |
|
|
|
|
|
|
|
|
|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
min bk=12 | a | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
b | 12 | 25 | 0 | 18 | ∞ | ∞ | ∞ | ∞ |
|
c | 3 | 3 | 0 | 3 | 3 | 3 | 3 | 3 |
|
min bk=18 | a | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
b | 12 | 25 | 0 | 18 | ∞ | 38 | ∞ | ∞ |
|
c | 3 | 3 | 0 | 3 | 3 | 4 | 3 | 3 |
|
min bk=25 | a | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
b | 12 | 25 | 0 | 18 | 47 | 38 | ∞ | 60 |
|
c | 3 | 3 | 0 | 3 | 2 | 4 | 3 | 2 |
|
min bk=38 | a | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 |
b | 12 | 25 | 0 | 18 | 47 | 38 | 62 | 60 |
|
c | 3 | 3 | 0 | 3 | 2 | 4 | 6 | 2 |
|
min bk=47 | a | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 |
b | 12 | 25 | 0 | 18 | 47 | 38 | 61 | 60 |
|
c | 3 | 3 | 0 | 3 | 2 | 4 | 5 | 2 |
|
min bk=60 | a | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 |
b | 12 | 25 | 0 | 18 | 47 | 38 | 61 | 60 |
|
c | 3 | 3 | 0 | 3 | 2 | 4 | 5 | 2 |
|
Таким образом, для решения ЗК нужно n раз применить алгоритм Дейкстры следующим образом.
Возьмём произвольную пару вершин
j,k. Исключим непосредственное ребро C[j,k]. С помощью алгоритма Дейкстры найдём кратчайшее расстояние между городами j..k. Пусть это расстояние включает некоторый город m. Имеем часть тура j,m,k. Теперь для каждой пары соседних городов (в данном примере – для j,m и m,k) удалим соответственное ребро и найдём кратчайшее расстояние. При этом в кратчайшее расстояние не должен входить уже использованный город.
Далее аналогично находим кратчайшее расстояние между парами вершин алгоритмом Дейкстры, до тех пор, пока все вершины не будут задействованы. Соединим последнюю вершину с первой и получим тур. Чаще всего это последнее ребро оказывается очень большим, и тур получается с погрешностью, однако алгоритм Дейкстры можно отнести к приближённым алгоритмам.
1.2.5. Мой метод (метод Анищенко) решения задачи коммивояжера
Я предложу свой метод решения задачи коммивояжера.
Рассмотрим рис. 9-10 и попытаемся найти в них кратчайшие туры. Очевидно, что кратчайший тур не должен содержать пересекающихся ребёр (в противном случае, поменяв вершины при пересекающихся рёбрах местами, получим более короткий тур). В первом случае кратчайшим является тур 1-2-4-5-3-1, а во втором – тур 1-2-3-4-5-1. Анализируя множество других аналогичных расположений пяти и более городов, можно сделать следующее общее предположение:
1. Если можно построить выпуклый многоугольник, по периметру которого лежат все города, то такой выпуклый многоугольник является кратчайшим туром.
Однако не всегда можно построить выпуклый многоугольник, по периметру которого лежали бы все города. Велика вероятность того, что некоторые города не войдут в выпуклый многоугольник. Такие города будем называть «центральными». Так как построить выпуклый многоугольник довольно легко, то задача сводится к тому, чтобы включить в тур в виде выпуклого многоугольника все центральные города с минимальными потерями. Пусть имеется массив T[n+1], содержащий в себе номера городов по порядку, которые должен посетить коммивояжер, т. е. вначале коммивояжер должен посетить город T[1], затем T[2], потом T[3] и т. д,, причём T[n+1]=T[1] (коммивояжер должен вернуться в начальный город). Тогда, если выполняется равенство "i∈[1,2..n]; C[T[i],p]+C[p,T[i+1]] – C[T[I],T[i+1]]=min, то центральный город с номером p нужно включить в тур между городами T[i] и T[i+1]. Проделав эту операцию для всех центральных городов, в результате получим кратчайший тур. Данный алгоритм можно реализовать на языке Паскаль и проверить верность предположения 1. Для задачи, решённой нами методом ветвей и границ, мой алгоритм даёт правильное решение.
Попробуем решить данным алгоритмом ЗК для восьми городов. Пусть имеем восемь городов, расположение которых показано на рис. 11. Матрица расстояний приведена рядом на табл. 13. Промежуточные построения кратчайшего тура показаны пунктирными линиями, цифры – порядок удаления рёбер. Таким образом, имеем для данного случая кратчайший тур 1-3-7-5-4-8-6-2-1. Длина этого тура: D=6+7+5+2+6+5+13+13=57. Этот результат является правильным, т. к. алгоритм лексического перебора, который никогда не ошибается, даёт точно такой же тур. (Следует также отметить, что жадный алгоритм для этого случая ошибается всего на 1 и даёт тур 1-3-4-5-7-8-6-2-1 длиной в 58).
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
1 |
| 13 | 6 | 13 | 14 | 15 | 14 | 16 |
2 | 13 |
| 11 | 11 | 8 | 13 | 17 | 14 |
3 | 6 | 11 |
| 5 | 6 | 11 | 7 | 11 |
4 | 13 | 11 | 5 |
| 2 | 6 | 7 | 6 |
5 | 14 | 8 | 6 | 2 |
| 6 | 5 | 6 |
6 | 15 | 13 | 11 | 6 | 6 |
| 13 | 5 |
7 | 14 | 17 | 7 | 7 | 5 | 13 |
| 9 |
8 | 16 | 14 | 11 | 6 | 6 | 5 | 9 |
|
табл. 13 |
|
|
|
|
|
|
|
|
Одним из возможных недостатков такого алгоритма является необходимость знать не матрицу расстояний, а координаты каждого города на плоскости. Если нам известна матрица расстояний между городами, но неизвестны их координаты, то для их нахождения нужно будет решить n систем квадратных уравнений с n неизвестными для каждой координаты. Уже для 6 городов это сделать очень сложно. Если же, наоборот, имеются координаты всех городов, но нет матрицы расстояний между ними, то создать эту матрицу несложно. Это можно легко сделать в уме для 5-6 городов. Для большего количества городов можно воспользоваться возможностями компьютера, в то время как промоделировать решение системы квадратных уравнений на компьютере довольно сложно.
На основе вышеизложенного можно сделать вывод, что мой алгоритм, наряду с деревянным алгоритмом и алгоритмом Дейкстры, можно отнести к приближённым (хотя за этим алгоритмом ни разу не было замечено выдачи неправильного варианта).
1.2.6. Анализ методов решения задачи коммивояжера
Для подведения итогов в изучении методов решения ЗК протестируем наиболее оптимальные алгоритмы на компьютере по следующим показателям: количество городов, время обработки, вероятность неправильного ответа. Данные занесём в таблицу.
Алгоритм лексического перебора | |||
Кол-во городов | Время обработки, c | Вероятность неправильного ответа, % | Тип алгоритма |
10 | 41 | 0 | точный |
12 | 12000=3ч.20мин | 0 |
|
32 | -* | 0 |
|
100 | -* | 0 |
|
Метод ветвей и границ |
|
|
|
10 | ~0 | 0 | точный |
32 | ~0.0001 | 0 |
|
100 | 1.2 | 0 |
|
Мой алгоритм решения ЗК |
|
|
|
10 | 0.001 | 0 | приближенный |
32 | 2.5 | 0 |
|
100 | 6 | 0 |
|