Вы находитесь на странице: 1из 5

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ОБРАЗОВАНИЯ

МОСКОВСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ


ВЫСШАЯ ШКОЛА ПЕЧАТИ И МЕДИАИНДУСТРИИ

Институт Принтмедиа и информационных технологий


Кафедра Информатики и информационных технологий

направление подготовки
09.03.02 «Информационные системы и технологии»

ЛАБОРАТОРНАЯ РАБОТА № 4

Дисциплина: технологии обработки информации

Выполнил(а): студент(ка) группы 201-724

Гуляев Дмитрий Максимович


(Фамилия И.О.)

Дата, подпись
(Дата) (Подпись)

Проверил:
(Фамилия И.О., степень, звание) (Оценка)

Дата, подпись
(Дата) (Подпись)

Замечания:

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

Ознакомиться с алгоритмом отжига, осуществить его программную


реализацию

Теоретическое обоснование.
Алгоритм имитации отжига— общий алгоритмический метод решения задачи
глобальнойоптимизации, особенно дискретной и комбинаторной оптимизации.
Один из примеров методовМонте-Карло. Алгоритм основывается на имитации
физического процесса, который происходитпри кристаллизации вещества, в том
числе при отжиге металлов. Предполагается, что атомы ужевыстроились в
кристаллическую решётку, но ещё допустимы переходы отдельных атомов
изодной ячейки в другую. Предполагается, что процесс протекает при постепенно
понижающейсятемпературе. Переход атома из одной ячейки в другую происходит
с некоторой вероятностью,причём вероятность уменьшается с понижением
температуры. Устойчивая кристаллическаярешётка соответствует минимуму
энергии атомов, поэтому атом либо переходит в состояние сменьшим уровнем
энергии, либо остаётся на месте. (Этот алгоритм также называется алгоритмомН.
Метрополиса, по имени его автора)

Листинг
import numpy as np
import matplotlib.pyplot as plt

class Town: # координаты


города def init (self, x,
y):
self.x = x
self.y = y

@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

if name == ' main ':


coords = [] # Заполнение
координат for i in range(30):
# число городов
coords.append(Town(np.random.uniform(), np.random.uniform()))
fig = plt.figure(figsize=(10, 5)) #
Построение графика ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
for first, second in zip(coords[:-1], coords[1:]):
ax1.plot([first.x, second.x], [first.y,
second.y], 'b')
ax1.plot([coords[0].x, coords[-1].x], [coords[0].y, coords[-
1].y], 'b') for c in coords:

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

# получение новой стоимости пути


new_cost = Town.get_total_distance(coords)

if new_cost < min_cost: # если стоимость ниже,


записываем решение min_cost = new_cost
else:
x = np.random.uniform()
if x < np.exp((min_cost - new_cost) / T): #
фактор случайности min_cost = new_cost
else:
temp = coords[r1]
coords[r1] =
coords[r2]
coords[r2] = temp

# выводим результат в график


for first, second in zip(coords[:-1],
coords[1:]): ax2.plot([first.x, second.x],
[first.y, second.y], 'b')
ax2.plot([coords[0].x, coords[-1].x], [coords[0].y, coords[-1].y],
'b')

for c in coords:
ax2.plot(c.x, c.y,
'ro')

plt.show()
import numpy as
np
import matplotlib.pyplot as plt

class Town: # координаты


города def init (self,
x, y):
self.x =
x self.y
= y

@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

if name == ' main ':


coords = [] # Заполнение
координат for i in range(30):
# число городов

fig = plt.figure(figsize=(10, 5)) #


Построение графика ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
for first, second in zip(coords[:-1],
coords[1:]): ax1.plot([first.x, second.x],
[first.y, second.y], 'b')
ax1.plot([coords[0].x, coords[-1].x], [coords[0].y,
coords[-1].y], 'b') for c in coords:
ax1.plot(c.x, c.y, 'ro')

# Алгоритм
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

# получение новой стоимости пути


new_cost = Town.get_total_distance(coords)

if new_cost < min_cost: # если стоимость ниже,


записываем решение min_cost = new_cost
else:
x = np.random.uniform()
if x < np.exp((min_cost - new_cost) / T): #
фактор случайности min_cost = new_cost
else:
temp = coords[r1]
coords[r1] =
coords[r2]
coords[r2] = temp

# выводим результат в график


for first, second in zip(coords[:-1],
coords[1:]): ax2.plot([first.x, second.x],
[first.y, second.y], 'b')
ax2.plot([coords[0].x, coords[-1].x], [coords[0].y, coords[-1].y],
'b')

for c in coords:
ax2.plot(c.x, c.y,
'ro')

plt.show()

Результат работы программы:

Вам также может понравиться