Академический Документы
Профессиональный Документы
Культура Документы
tsp (комивояжера)
tsp (комивояжера)
Наименование: задача коммивояжёра (TSP – Travelling salesman problem) метод ветвей и границ
Ход работы:
Теория:
Имеется n населенных пунктов (n>0) с заданными между ними расстояниями aij ( i, j = 1, …, n). Если прямого
сообщения между пунктами i и j не существует, то полагаем aij = бесконечности. Также считаем aij =
бесконечности, i = 1, …, n. Так как на некоторых дорогах допускается только одностороннее движение, то,
вообще говоря, aij != aji.
Требуется найти только маршрут, начинающийся в данном населенном пункте, проходящий ч/з все
населенные пункты по одному разу и заканчивающийся в исходном пункте (такие циклы называются
гамильтоновыми), чтобы его длина была минимальной. Это задача коммивояжёра.
Задача коммивояжёра может быть решена с помощью простого перебора всех возможных маршрутов. Но
при больших n число маршрутов огромно. С целью сокращения перебора используют метод ветвей и границ.
Описание алгоритма
import math
from typing import List
maxsize = float('inf')
class TSPP:
def __init__(self, matrix: List[List[int]]) -> None:
self.matrix = matrix
self.n = len(matrix) # размерность матрицы
self.visited = [False] * self.n # массив посещённости точек
self.path_length = maxsize # длина результирующего пути
self.path = [-1] * (self.n + 1) # результирующий путь
self._curr_path = [-1] * (self.n+1) # текущий путь
self._curr_bound = 0. # текущая оценка
self._curr_weight = 0. # текущая сумма
self._curr_level = 1 # текущий уровень ветвления
self._curr_bound = math.ceil(self._curr_bound / 2)
# Запускаем алгоритм.
self.TSPRecursive()
return min
return second
self.TSPRecursive(curr_weight, level + 1)
def TSP(matrix):
tsp = TSPP(matrix)
print("Len:", tsp.path_length)
print("Trace:", '->'.join(str(tsp.path[i]+1) for i in range(tsp.n + 1)))
ex43 = [
[0, 7, 2, 9, 7],
[5, 0, 3, 9, 1],
[4, 8, 0, 5, 3],
[5, 6, 4, 0, 7],
[7, 6, 3, 7, 0]]
TSP(ex43)
# Длина пути: 21
# Путь: 1->2->5->3->4->1
no38 = [
[0, 3, 6, 1, 4],
[9, 0, 9, 3, 8],
[7, 1, 0, 7, 5],
[1, 4, 6, 0, 1],
[2, 5, 1, 8, 0]]
# TSP(no38)
# Длина пути: 13
# Путь: 1->4->5->3->2->1
Решение задач:
Пример 43.
Расстояния между населенными пунктами заданы с помощью матрицы
Задача 38.
Для матрицы
Вывод: В ходе лабораторной работе мы изучили и написали программу решения задачи коммивояжёра
методом ветвей и границ.