
1.4.2 Задача коммивояжёра
Задачи такого типа известны под общим названием задача коммивояжёра, в «классической» формулировке которой коммивояжёр пытается определить кратчайший маршрут для одноразового посещения n городов. По существу, это задача является задачей о назначениях с дополнительными ограничениями, которые гарантируют исключение из оптимального решения неполных замкнутых маршрутов (в задаче коммивояжёра замкнутый маршрут, проходящий через каждый пункт только один раз, называется циклом цикл, проходящий через все пункты, называется полным, в противном случае – частичным или подциклом).
В задаче коммивояжёра с n городами можно определить такие переменный приведённые в формуле (1.4.2.1).
Имея значения Cij – расстояние от города i до города j (считается, что Cij=∞ при i=j), задачу коммивояжёра можно формализовать следующим образом, показанную в формуле (1.4.2.2)
При ограничениях, показанных в формулах (1.4.2.3)
Решения должно быть полным циклом[5].
Основные методы решения задачи коммивояжёра построены на тех же основах, что и методы ветвей и границ и отсекающих плоскостей.
Рассмотрим алгоритм решения задачи коммивояжёра, используя методы решения задач о назначении и метод ветвей и границ.
Применение метода ветвей и границ для решения задачи коммивояжера.
Решения задачи данным методом, можно представить следующим алгоритмом:
1. На первом этапе решается задача о назначениях. Полученное решение принимается за нижнюю границу нахождения решения задачи коммивояжёра. За верхнюю границу можно принять сумму элементов С12+С23+С34+..+Сn1.
Если на первом этапе получен цикл, то его принимают за оптимальное решение задачи коммивояжёра.
2. Иначе чтобы исключить частные циклы в полученном решении принудительно приравниваются xij, задающие этот цикл, к бесконечности (например, если цикл состоит из 2 переменных, то приравнивается лишь одна переменная к бесконечности).
Каждое из подобных ограничений порождает отдельную ветвь дерева подзадач (и, конечно, отдельную подзадачу). Важно заметить, что нет необходимости разбивать все имеющиеся частные циклы – достаточно исключить только один частный цикл. Причина этого в том, что введение в задачу нового ограничения автоматически влияет на значения всех переменных этой задачи, что создаёт «благоприятные» условия для формирования полного цикла. На основании этого аргумента обычно разбивают один частный цикл, наименьший по количеству составляющих его переменных, поскольку это приводит к меньшему количеству новых ветвей в дереве подзадач.
Выбирая для удаления короткий цикл, получаем на дереве подзадач две ветви. Новые задачи о назначениях строятся путём удаления из последней задачи переменной ветвеления, что уменьшает размер подзадач[5].
Решаем данные задачи как задачи о назначениях. Если получено решение без полного цикла, возвращаемся к этапу 2 изложенному выше.
Если полученное решение больше чем принятое за верхнее граничное, то данная ветвь откидывается, в противном случае принимается за верхнее граничное значение целевой функции.
Когда не рассмотренных задач не остаётся, верхнее граничное значение полученное на одной из ветвей будет решением данной задачи.