6
.docxГУАП
КАФЕДРА № 41
ОТЧЕТ
ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
старший преподаватель |
|
|
|
Е.П. Виноградова |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №6 |
Применение метода ветвей и границ для решения задачи коммивояджера |
по курсу: Прикладные методы оптимизации |
|
|
РАБОТУ ВЫПОЛНИЛА
СТУДЕНТКА ГР. |
4716 |
|
|
|
С.А. Янышева |
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург
2020
Лабораторная работа № 6
Применение метода ветвей и границ для решения задачи коммивояджера
Цель работы
Решить задачу коммивояжера с помощью метода ветвей и границ.
Вариант задания
Вариант 3
-
M
5
6
4
13
M
2
8
10
5
M
9
5
7
2
M
Ход выполнения работы
Программа работает по принципу гамильтоново цикла. Для стартовой вершины программа выбирает минимальный путь, который ведёт из вершины старта, далее так же по принципу выбора минимума выбирает в какую следующую вершины пойти, исключая вершины, которые уже были пройдены ранее.
Листинг 1 – Код программы
import igraph from os import startfile
def branch_and_bound(v, matrix): gp = [[v]] for _ in range(len(matrix)-1): paths = [] [[paths.append(gp[i]+[j]) for j in range(len(matrix[gp[i][-1]])) \ if (j not in gp[i]) and matrix[gp[i][-1]][j]] for i in range(len(gp))] ests = [] for i in paths: min_path = [min([matrix[j][k] for k in range(len(matrix[j])) if k not in i[1:] and k != j]) \ for j in range(len(matrix)) if j not in i[:-1]] ests.append(sum([matrix[i[j]][i[j+1]] for j in range(len(i[:-1]))])+sum(min_path)-\ sum([min([matrix[j][k] for j in range(len(matrix)) if j != k and j not in i[:-1]]) \ for k in range(len(matrix)) if k not in i[1:]])) min_est = min(ests) gp = [paths[i] for i in range(len(paths)) if ests[i] == min_est] return [i+[v] for i in gp]
def print_graph(matrix): G = igraph.Graph(directed=False) G.add_vertices(len(matrix)) G.vs['label'] = [i for i in range(len(matrix))] G.vs['color'] = ['white'] G.add_edges([(i, j) for i in range(len(matrix)) for j in range(len(matrix[i]))\ if matrix[i][j] != 0 and i < j]) G.es['weight'] = [j for i in range(len(matrix)) for j in matrix[i] if j != 0] G.es['label'] = [edge for edge in G.es['weight']] layout = G.layout('kk') igraph.plot(G, 'L6.png', bbox=(800, 600), layout=layout, vertex_size=40, vertex_label_size=10) startfile(r'L6.png')
matrix = [[0,5,6,4], [13,0,2,8], [10,5,0,9], [5,7,2,0]]
shortest_loops = branch_and_bound(0,matrix) print('Shortest loop(s) =', shortest_loops, '\nSum =', sum(matrix[k[i]][k[i+1]] for k in shortest_loops for i in range(len(k[:-1])))) print_graph(matrix) |
Рисунок 1 – Результат работы программы
Рисунок 2 – Исходный граф
Выводы
В ходе выполнения лабораторной работы была изучена задача коммивояжера. Написав программу для решения задачи коммивояжера, убедились в правильности выполнения на основании результата.