Академический Документы
Профессиональный Документы
Культура Документы
ВЫСШЕГО ОБРАЗОВАНИЯ
направление подготовки
09.03.02 «Информационные системы и технологии»
ЛАБОРАТОРНАЯ РАБОТА № 4
Дата, подпись
(Дата) (Подпись)
Проверил:
(Фамилия И.О., степень, звание) (Оценка)
Дата, подпись
(Дата) (Подпись)
Замечания:
2023
Цель работы.
Теоретическое обоснование.
Алгоритм имитации отжига— общий алгоритмический метод решения задачи
глобальнойоптимизации, особенно дискретной и комбинаторной оптимизации.
Один из примеров методовМонте-Карло. Алгоритм основывается на имитации
физического процесса, который происходитпри кристаллизации вещества, в том
числе при отжиге металлов. Предполагается, что атомы ужевыстроились в
кристаллическую решётку, но ещё допустимы переходы отдельных атомов
изодной ячейки в другую. Предполагается, что процесс протекает при постепенно
понижающейсятемпературе. Переход атома из одной ячейки в другую происходит
с некоторой вероятностью,причём вероятность уменьшается с понижением
температуры. Устойчивая кристаллическаярешётка соответствует минимуму
энергии атомов, поэтому атом либо переходит в состояние сменьшим уровнем
энергии, либо остаётся на месте. (Этот алгоритм также называется алгоритмомН.
Метрополиса, по имени его автора)
Листинг
import numpy as np
import matplotlib.pyplot as plt
@staticmethod
def get_distance(a, b):
return np.sqrt(np.abs(a.x - b.x) + np.abs(a.y - b.y))
@staticmethod
def
get_total_distance(coord
s): dist = 0
for first, second in zip(coords[:-1],
coords[1:]): dist +=
Town.get_distance(first, second)
dist += Town.get_distance(coords[0],
coords[-1]) return dist
min_cost = Town.get_total_distance(coords)
T = 30
factor = 0.99 # фактор
случайности T_init = T
for i in range(1000): # итерации
print(i, 'Минимальный путь', min_cost)
T = T * factor
for j in range(500):
# обмен местами городов
r1, r2 = np.random.randint(0, len(coords), size=2)
temp = coords[r1]
coords[r1] =
coords[r2]
coords[r2] = temp
for c in coords:
ax2.plot(c.x, c.y,
'ro')
plt.show()
import numpy as
np
import matplotlib.pyplot as plt
@staticmethod
def get_distance(a, b):
return np.sqrt(np.abs(a.x - b.x) + np.abs(a.y - b.y))
@staticmethod
def
get_total_distance(coo
rds): dist = 0
for first, second in zip(coords[:-1],
coords[1:]): dist +=
Town.get_distance(first, second)
dist += Town.get_distance(coords[0],
coords[-1]) return dist
# Алгоритм
min_cost = Town.get_total_distance(coords)
T = 30
factor = 0.99 # фактор
случайности T_init = T
for i in range(1000): # итерации
print(i, 'Минимальный путь', min_cost)
T = T * factor
for j in range(500):
# обмен местами городов
r1, r2 = np.random.randint(0, len(coords), size=2)
temp = coords[r1]
coords[r1] =
coords[r2]
coords[r2] = temp
for c in coords:
ax2.plot(c.x, c.y,
'ro')
plt.show()