Рубрики
Без рубрики

Как реализовать имитированный алгоритм отжига в Python

Алгоритм симулированного отжига обычно используется, когда мы застряли, пытаясь оптимизировать решения, которые … Tagged Python, Computerscience, Ai, алгоритмы.

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

Это называется симулированным отжигом, потому что это моделирование после реального физического процесса отжига что-то вроде металла. Когда вы нагреваете определенный металл, там много энергии там, и вы можете перемещать вещи довольно систематически. Но со временем, когда система остывает, в конечном итоге она урегует к последнему положению.

Мы собираемся имитировать этот процесс некоторых высокотемпературных систем, где все могут двигаться довольно часто, но со временем уменьшаются, что температура до тех пор, пока мы в конечном итоге не доехают при окончательном решении.

В этом коде Python у нас будет алгоритм, чтобы найти мировой минимальный минимум, но вы можете легко изменить его, чтобы найти глобальный максимум.

Во-первых, мы должны определить, как мы уменьшите температуру на каждой итерации. В этом примере мы начнем с температуры 90 градусов, и мы уменьшим температуру тока на 0,01 линейно, пока не достигнем конечной температуры 0,1 градуса.

initial_temp = 90
final_temp = .1
alpha = 0.01
current_temp = initial_temp

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

current_state = initial_state
solution = current_state

Теперь мы повторим этот процесс, пока текущая температура не будет меньше, чем конечная температура.

while current_temp > final_temp

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

neighbor = random.choice(self.get_neighbors())

Затем мы рассчитаем различия между соседом и текущим состоянием.

cost_diff = self.get_cost(self.current_state) = self.get_cost(neighbor)

Если новое решение лучше, мы приму это.

if cost_diff > 0:
  solution = neighbor

Если новое решение не лучше, мы все равно будем принять его, если температура высока. С помощью этого подхода мы будем использовать худшее решение, чтобы избежать застревания в локальном минимуме. Но мы получим сосед, который не так хуже, чем нынешнее государство. Мы можем определить, что со следующим уравнением вероятностей:

if random.uniform(0, 1) < math.exp(cost_diff / current_temp):
  solution = neighbor

Следующим шагом является уменьшение текущей температуры в соответствии с альфа ценность.

current_temp -= alpha

Так что в самом конце мы просто вернемся к тому, что существует текущее состояние.

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

import random
import math

def simulated_annealing(initial_state):
    """Peforms simulated annealing to find a solution"""
    initial_temp = 90
    final_temp = .1
    alpha = 0.01

    current_temp = initial_temp

    # Start by initializing the current state with the initial state
    current_state = initial_state
    solution = current_state

    while current_temp > final_temp:
        neighbor = random.choice(get_neighbors())

        # Check if neighbor is best so far
        cost_diff = get_cost(self.current_state) = get_cost(neighbor)

        # if the new solution is better, accept it
        if cost_diff > 0:
            solution = neighbor
        # if the new solution is not better, accept it with a probability of e^(-cost/temp)
        else:
            if random.uniform(0, 1) < math.exp(cost_diff / current_temp):
                solution = neighbor
        # decrement the temperature
        current_temp -= alpha

    return solution

def get_cost(state):
    """Calculates cost of the argument state for your solution."""
    raise NotImplementedError

def get_neighbors(state):
    """Returns neighbors of the argument state for your solution."""
    raise NotImplementedError

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

Оригинал: “https://dev.to/cesarwbr/how-to-implement-simulated-annealing-algorithm-in-python-4gid”