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

ЛР5-6 / Имитация отжига

.py
Скачиваний:
28
Добавлен:
03.07.2021
Размер:
1.99 Кб
Скачать
import math
import random
from random import shuffle

# GLOBAL VALUES
coords = []

S = []

# FUNCTIONS
def loadData(dataCount):
    global M
    table = open(('Tests/' + str(dataCount) + '.txt'), 'r').readlines() # считаем из файла все строки
    table = [[int(item) for item in line.split()] for line in table] # каждую строку разбиваем на числа
    coords = list(map(lambda s: [s[0], s[1], s[2], s[3]], table))
    for i in range(dataCount):
        for j in range(dataCount):
            M[i][j] = math.sqrt((coords[i][1] - coords[j][1]) ** 2 + (coords[i][2] - coords[j][2]) ** 2 + (coords[i][3] - coords[j][3]) ** 2)


def F(S):
    F = 0
    for i in range(dataCount-1):
        F += M[S[i]][S[i+1]]
    F += M[S[dataCount-1]][S[0]] #расстояние между последним и первым городом
    return F

def GenerateCandidate():
    global S,S_next,dataCount
    r1 = random.randint(0,dataCount-1)
    r2 = random.randint(0, dataCount-1)
    S_next = S.copy()
    S_next[r1] = S[r2]
    S_next[r2] = S[r1]

#main

dataCount = int(input('Введите количество данных(50,75,100): '))
M = [[0]*dataCount for _ in range(dataCount)]#инициализация M
loadData(dataCount) #загружаем данные

S = list(range(dataCount)) #генерируем список из случайного порядка вершин (начальное решение S)
random.shuffle(S)
#for i in range(dataCount):
 #   S.append(i)

S_next = []
r = 0.999
T = 100.0
L = 5
while (T>1e-6) :
    for i in range(L):
        GenerateCandidate()
        delta = F(S_next)-F(S)
        if(delta <=0):
            S = S_next.copy()
        else:
            P = random.random()
            if(math.exp(-delta/T)>=P):
                S = S_next.copy()
    T=T*r



print("F(S):",F(S))
S= [x+1 for x in S]
S.append(S[0])
print("S:",S)