Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

6

.docx
Скачиваний:
20
Добавлен:
16.04.2021
Размер:
150.71 Кб
Скачать

ГУАП

КАФЕДРА № 41

ОТЧЕТ

ЗАЩИЩЕН С ОЦЕНКОЙ

ПРЕПОДАВАТЕЛЬ

старший преподаватель

Е.П. Виноградова

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №6

Применение метода ветвей и границ для решения задачи коммивояджера

по курсу: Прикладные методы оптимизации

РАБОТУ ВЫПОЛНИЛА

СТУДЕНТКА ГР.

4716

С.А. Янышева

подпись, дата

инициалы, фамилия

Санкт-Петербург

2020

Лабораторная работа № 6

Применение метода ветвей и границ для решения задачи коммивояджера

  1. Цель работы

Решить задачу коммивояжера с помощью метода ветвей и границ.

  1. Вариант задания

Вариант 3

M

5

6

4

13

M

2

8

10

5

M

9

5

7

2

M

  1. Ход выполнения работы

Программа работает по принципу гамильтоново цикла. Для стартовой вершины программа выбирает минимальный путь, который ведёт из вершины старта, далее так же по принципу выбора минимума выбирает в какую следующую вершины пойти, исключая вершины, которые уже были пройдены ранее.

Листинг 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 – Исходный граф

  1. Выводы

В ходе выполнения лабораторной работы была изучена задача коммивояжера. Написав программу для решения задачи коммивояжера, убедились в правильности выполнения на основании результата.

Соседние файлы в предмете Прикладные методы оптимизации