Python에서 시뮬레이션된 어닐링 알고리즘을 구현하는 방법
왜 시뮬레이션된 어닐링인가?
금속과 같은 것을 어닐링하는 실제 물리적 프로세스를 모델링한 것이기 때문에 Simulated Annealing이라고 합니다. 특정 금속을 가열하면 거기에 많은 에너지가 있고 매우 체계적으로 물건을 움직일 수 있습니다. 그러나 시간이 지남에 따라 시스템이 냉각되면서 결국 최종 위치에 안착합니다.
우리는 일부 고온 시스템의 프로세스를 시뮬레이션할 것입니다. 이 프로세스에서는 사물이 매우 자주 이동할 수 있지만 시간이 지남에 따라 궁극적인 솔루션에 도달할 때까지 온도를 낮추게 됩니다.
어떻게 작동하나요?
이 Python 코드에는 전역 최소값을 찾는 알고리즘이 있지만 전역 최대값을 찾기 위해 이를 쉽게 수정할 수 있습니다.
먼저 각 반복에서 온도를 낮추는 방법을 결정해야 합니다. 이 예에서는 90도의 온도에서 시작하여 최종 온도인 0.1도에 도달할 때까지 현재 온도를 선형으로 0.01 감소시킵니다.
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
다음 단계는 alpha
값에 따라 현재 온도를 낮추는 것입니다.
current_temp -= alpha
따라서 맨 마지막에 우리는 현재 상태가 무엇이든 상관없이 돌아갑니다.
이것은 문제를 해결하고 무작위 이웃을 계속 생성하는 과정인 Simulated Annealing 알고리즘의 큰 그림입니다. 현재 상태보다 나은 경우 항상 이웃으로 이동합니다. 하지만 이웃이 지금보다 더 나빠도 온도와 날씨에 따라 가끔 이사를 가게 됩니다.
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
결론
결과적으로 이 전체 프로세스의 목표는 전역 최대값 또는 전역 최소값으로 가는 길을 찾기 시작할 때 로컬 최대값 또는 로컬 최소값에 갇히게 되면 순서대로 빠져나갈 수 있다는 것입니다. 궁극적으로 최상의 솔루션을 탐색하는 방법을 만듭니다. 그리고 온도가 내려가면 결국 우리가 지금까지 할 수 있는 세계적으로 가장 좋은 일이라고 생각한 것에서 너무 많이 움직이지 않고 그곳에 정착합니다.
Reference
이 문제에 관하여(Python에서 시뮬레이션된 어닐링 알고리즘을 구현하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/cesarwbr/how-to-implement-simulated-annealing-algorithm-in-python-4gid
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
이 Python 코드에는 전역 최소값을 찾는 알고리즘이 있지만 전역 최대값을 찾기 위해 이를 쉽게 수정할 수 있습니다.
먼저 각 반복에서 온도를 낮추는 방법을 결정해야 합니다. 이 예에서는 90도의 온도에서 시작하여 최종 온도인 0.1도에 도달할 때까지 현재 온도를 선형으로 0.01 감소시킵니다.
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
다음 단계는
alpha
값에 따라 현재 온도를 낮추는 것입니다.current_temp -= alpha
따라서 맨 마지막에 우리는 현재 상태가 무엇이든 상관없이 돌아갑니다.
이것은 문제를 해결하고 무작위 이웃을 계속 생성하는 과정인 Simulated Annealing 알고리즘의 큰 그림입니다. 현재 상태보다 나은 경우 항상 이웃으로 이동합니다. 하지만 이웃이 지금보다 더 나빠도 온도와 날씨에 따라 가끔 이사를 가게 됩니다.
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
결론
결과적으로 이 전체 프로세스의 목표는 전역 최대값 또는 전역 최소값으로 가는 길을 찾기 시작할 때 로컬 최대값 또는 로컬 최소값에 갇히게 되면 순서대로 빠져나갈 수 있다는 것입니다. 궁극적으로 최상의 솔루션을 탐색하는 방법을 만듭니다. 그리고 온도가 내려가면 결국 우리가 지금까지 할 수 있는 세계적으로 가장 좋은 일이라고 생각한 것에서 너무 많이 움직이지 않고 그곳에 정착합니다.
Reference
이 문제에 관하여(Python에서 시뮬레이션된 어닐링 알고리즘을 구현하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/cesarwbr/how-to-implement-simulated-annealing-algorithm-in-python-4gid
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Python에서 시뮬레이션된 어닐링 알고리즘을 구현하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/cesarwbr/how-to-implement-simulated-annealing-algorithm-in-python-4gid텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)