Домашнее задание по информатике №1 1 Задача о коммивояжере (перебор вариантов) Классическая формулировка задачи известна уже более 200 лет: имеются n городов, расстояния между которыми заданы; коммивояжеру (бродячему торговцу) необходимо выйти из какого-то города, посетить остальные n-1 городов точно по одному разу и вернуться в исходный город. При этом маршрут коммивояжера должен быть минимальной длины (стоимости). Задача коммивояжера [1] принадлежит классу NP-полных, то есть неизвестны полиномиальные алгоритмы ее решения. В задаче с n городами необходимо рассмотреть (n-1)! маршрутов, чтобы выбрать маршрут минимальной длины. Итак, при больших значениях n невозможно за разумное время получить результат. Методы решения задачи Существует множество методов решения задачи коммивояжера, но классическими стали такие известные методы, как: 1) поиск в глубину [2, 3]; 2) поиск в ширину [4]; 3) метод грубой силы или полного перебора (самый долгий) [5]. 2 Постановка задачи коммивояжера на графах Пусть имеется n городов. Расстояния между любой парой городов (i, j) известны и составляют dij, где i=1, m; j=1, n; i≠j. Если прямого маршрута сообщения между городами не существует, а также для всех i=j полагаем, что dij=∞. На этом основании расстояния между городами удобно представить в виде матрицы D dij nn . Рис. 1. Неориентированный граф задачи коммивояжера Если городам поставить в соответствие вершины графа (см. рис. 1), а соединяющим их дорогам дуги, то в терминах теории графов задача заключается в определении гамильтонова контура минимальной длины. Гамильтоновым контуром называется путь, проходящий через все вершины графа, у которого начальная вершина совпадает с конечной, а длина контура определяется суммой длин всех дуг, входящих в контур. Таким образом, необходимо построить кольцевой маршрут проезда всех городов минимальной длины, начиная с любого пункта и в любую сторону. Поскольку всего городов n, то коммивояжер, выехав из заданного города, должен побывать в остальных (n-1) городах только один раз. Следовательно, всего существует (n-1)! возможных маршрутов, среди которых один или несколько – оптимальные. В большинстве случаев можно предположить, что расстояние между городами i и j является симметричным d d ji и равно расстоянию от города j до города i, т.е. ij . Расстояния между городами запишем в виде соответствующей матрицы и обозначим ее через D. Если в задаче n городов, то D является матрицей размером n n с d 0 неотрицательными элементами ij , которые отображают длины дуг в сети городов. При n=5 количество возможных, вариантов маршрутов равно 5 1! 24 . Расстояния между городами заданы матрицей в табл. 1. Таблица 1 i 1 2 3 4 5 1 ∞ 90 80 40 100 2 60 ∞ 40 50 70 3 50 30 ∞ 60 20 4 10 70 20 ∞ 50 5 20 40 50 20 ∞ j Маршрут можно представить в виде замкнутого контура, представляющего собой кольцевой маршрут, например, для графа, изображенного на рис. 1. Возможный вариант можно записать в виде совокупности соответствующих пар дуг: M k 1,2, 2,4, 4,5, 5,3, 3,1 Длина F M k маршрута равна сумме соответствующих длин дуг матрицы расстояний, тогда целевую функцию можно записать так: F M k d i , j M k ij min i 1, n; k 1, n 1. Для любого допустимого маршрута каждая строка и каждый столбец матрицы расстояний D содержат только по одному элементу. Решением задачи является определение кольцевого маршрута минимальной длины. 3 Задание на самостоятельную проработку Разработать программу решения задачи коммивояжера одним из трёх методов, перечисленных в разделе 1. В качестве подсказки используйте информацию приведённую из списка использованных источников. Проверить работоспособность программы на приведённом ниже примере (матрица А приведена ниже). @ 32 19 33 22 41 18 15 16 31 32 @ 51 58 27 42 35 18 17 34 19 51 @ 23 35 49 26 34 35 41 33 58 23 @ 33 37 23 46 46 32 22 27 35 33 @ 19 10 23 23 9 41 42 49 37 19 @ 24 42 42 10 18 35 26 23 10 24 @ 25 25 14 15 18 34 46 23 42 25 @ 1 32 16 17 35 46 23 42 25 1 @ 32 31 34 41 32 9 10 14 32 32 @ Решение для данной матрицы А имеет вид: 1 8 9 2 5 10 6 7 4 3 1, его стоимость 158. Оцените время работы программы. Если у Вас мощный компьютер, то создайте матрицу А[1..50,1..50] и попытайтесь найти наилучшее решение с помощью разобранного метода. Список использованных источников 1 http://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B4%D0%B0%D1%87% D0%B0_%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D0%B2%D0%BE %D1%8F%D0%B6%D0%B5%D1%80%D0%B0 2 http://kvodo.ru/dfs.html 3 http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_ %D0%B2_%D0%B3%D0%BB%D1%83%D0%B1%D0%B8%D0%BD%D1%83 4 http://kvodo.ru/search-width.html 5 http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B %D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D0%B1%D0%BE%D1%80