Загрузка данных


from math import e


# функция вероятности
def probability(delta, T):
    return 100 * e ** (-delta / T)


# изменение температуры
def reduceTemp(prevT):
    return 0.5 * prevT


# длина одного ребра
def edgeLength(i, j, distances):
    if i < j:
        for item in distances:
            if item[0] == i and item[1] == j:
                return item[2]
    else:
        for item in distances:
            if item[0] == j and item[1] == i:
                return item[2]


# длина маршрута
def routeLength(V, distances):
    summ = 0

    for i in range(len(V) - 1):
        summ += edgeLength(V[i], V[i + 1], distances)

    return summ


# одна перестановка в маршруте
def routeOneReplacement(arrV, z):
    arrV = arrV[:]

    first = z[0] - 1
    second = z[1] - 1

    arrV[first], arrV[second] = arrV[second], arrV[first]

    return arrV


# сам алгоритм отжига
def chooseRoute(distances, V, Z, T, P):
    sumLength = routeLength(V, distances)
    arrSum = [sumLength]
    arrV = V[:]

    for i in range(len(Z)):
        newV = routeOneReplacement(arrV, Z[i])
        newS = routeLength(newV, distances)
        arrSum.append(newS)

        delta = newS - sumLength

        if delta > 0:
            p = probability(delta, T)

            if p > P[i]:
                arrV = newV
                sumLength = newS

        else:
            arrV = newV
            sumLength = newS

        T = reduceTemp(T)

    return arrV, arrSum


# данные варианта 4
distances = [
    [1, 2, 17],
    [1, 3, 39],
    [1, 4, 32],
    [1, 5, 28],
    [1, 6, 18],
    [2, 3, 24],
    [2, 4, 28],
    [2, 5, 35],
    [2, 6, 13],
    [3, 4, 25],
    [3, 5, 43],
    [3, 6, 23],
    [4, 5, 20],
    [4, 6, 16],
    [5, 6, 24]
]

V = [1, 5, 2, 6, 3, 4, 1]

Z = [
    [3, 4],
    [4, 5],
    [5, 2],
    [6, 2]
]

P = [78, 79, 25, 82]

T = 100

bestRoute, arrLength = chooseRoute(distances, V, Z, T, P)

print(f"Лучший выбранный маршрут: {bestRoute}")
print(f"Длина лучшего выбранного маршрута: {routeLength(bestRoute, distances)}")
print(f"Длины всех рассмотренных маршрутов: {arrLength}")