Algoritmo de recocido simulado de la serie de algoritmos inteligentes

inserte la descripción de la imagen aquí

  La portada de este blog ChatGPT + DALL·E 2fue en coautoría.

prefacio

  Este artículo es el segundo artículo de la columna Algoritmo inteligente (recurrencia de Python) y(Simulate Anneal Algorithm, SAA) presenta principalmente la idea, la implementación y la simulación de escenarios de aplicación relacionados del algoritmo de recocido simulado python.

  El algoritmo de recocido simulado, como su nombre lo indica, es una simulación del proceso termodinámico de recocido de sólidos, es un algoritmo de búsqueda aleatoria adecuado para resolver problemas de optimización combinatoria a gran escala. A diferencia del algoritmo de búsqueda local general, SAAselecciona el estado con un valor objetivo relativamente pequeño en la vecindad con cierta probabilidad. En teoría, es un algoritmo óptimo global.

1. Pensamiento algorítmico

  El proceso de recocido sólido se refiere a un proceso termodinámico en el que un sólido se calienta para fundirse y luego se enfría lentamente para solidificarse en un cristal regular. Consiste principalmente en un proceso de calentamiento, un proceso isotérmico y un proceso de enfriamiento 3.
  (1)Proceso de calentamiento: cuando se calienta un sólido, a medida que aumenta la temperatura, el movimiento térmico de las partículas continúa fortaleciéndose, se desvía gradualmente de la posición de equilibrio y la disposición de las partículas también presenta un estado aleatorio. En este momento, el objeto aparece estar en estado líquido a nivel macroscópico, que es el fenómeno de la fusión. El proceso de fusión elimina el estado no uniforme que pudo haber existido en el sistema, y ​​la energía del sistema aumenta con el aumento de la temperatura;
  (2)proceso isotérmico: el proceso de recocido requiere que la temperatura disminuya lentamente, para que el sistema alcance un equilibrio estado a cada temperatura. Este proceso se puede explicar de acuerdo con la ley de reducción de energía libre: para un sistema cerrado que intercambia calor con el medio ambiente mientras la temperatura permanece constante, el cambio espontáneo del estado del sistema siempre procede en la dirección de reducción de energía libre, cuando la temperatura libre la energía alcanza el valor mínimo Cuando el sistema alcanza el estado de equilibrio;
  (3)el proceso de enfriamiento: la disminución de la temperatura hace que el movimiento térmico de las partículas se debilite gradualmente, la disposición de las partículas se vuelve gradualmente ordenada, la energía del sistema disminuye continuamente y finalmente se obtiene una estructura cristalina de baja energía. El proceso de recocido se completa cuando el líquido se solidifica en un estado cristalino sólido.

  SAAEs un algoritmo basado en la probabilidad que se usa para encontrar la solución óptima en un espacio de búsqueda grande. Utiliza un proceso similar al recocido sólido. Primero, el sólido se calienta a una temperatura suficiente (equivalente a la búsqueda aleatoria del algoritmo), y luego se enfría lentamente (equivalente a Basado en la búsqueda local del algoritmo), alcanza un estado de equilibrio en cada temperatura (equivalente a cada transición de estado del algoritmo) y finalmente alcanza el estado físico fundamental (equivalente a que el algoritmo encuentre la solución óptima ).
  En concreto, se puede expresar como: partículas a temperatura TTLa probabilidad de alcanzar el equilibrio en T es exp ( − Δ E k T ) exp(- \frac {\Delta E} {kT})e x pags ( -k Tmi _) , entre los cualesEEE es la temperaturaTTEnergía interna en T , ΔE ΔEΔE es su cambio,kkk es la constante de Boltzmann. Usando recocido sólido para simular problemas de optimización combinatoria, la energía internaEEE se modela como el valor de la función objetivofff , temperaturaTTT evoluciona al parámetro de controlttt , es decir, para obtener la solución del problema de optimización de combinaciónSAA:
  a partir de la solución inicialxxx y el valor inicial del parámetro de controlttComience en t , "产生新解 --> 计算目标函数差 --> 接受或舍弃"repitattEl valor t , la solución actual cuando termina el algoritmo es la solución óptima aproximada obtenida, que es un proceso heurístico de búsqueda aleatoria basado en el método de solución iterativa de Monte Carlo. El proceso de recocido está controlado por el programa de enfriamiento, incluido el valor inicial del parámetro de controlttt y su factor de atenuaciónΔt ΔtΔ t , cadattEl número de iteracionesLL en el valor de tL y condición de paradaSSS et al.

inserte la descripción de la imagen aquí

2. Ordenando los detalles

2.1 Selección de hiperparámetros

TSe recomienda elegir un valor mayor para la temperatura inicial y   un valor menor para la temperatura de terminación T_end. La temperatura inicial se selecciona aquí. T=100, T_end=0.001Demasiado grande o demasiado pequeño afectará la velocidad de convergencia del algoritmo, el número de iteraciones y el coeficiente de enfriamiento en cada temperatura puede ser apropiada de acuerdo con el escenario del problema Control, demasiado grande también afectará la velocidad de convergencia; la constante de Boltzmann kse establece en 1.

2.2 Algunos trucos

  De hecho, no es necesario seguir completamente el diagrama de flujo anterior SAA. Por ejemplo, el número de iteraciones a cada temperatura, en principio, esta parte afecta el número de iteraciones. Si el coeficiente de enfriamiento se establece para que sea ligeramente mayor, por ejemplo , entonces 0.99se pueden omitir algunas partes durante la implementación y el algoritmo aún puede obtener la solución óptima. Por supuesto, el blogger es solo una conclusión extraída sobre este tema, y ​​aún debe verificarse si es universal. Para la integridad del algoritmo, este artículo aún implementa el algoritmo de acuerdo con el diagrama de flujo SAA.

3. Implementación del algoritmo

3.1 Escenario del problema

  El problema de mayor valor, resuelve f ( x ) = xsin ( 5 x ) − xcos ( 2 x ) f(x) = xsin(5x) - xcos(2x)f ( x )=x s en ( 5 x )El valor mínimo de x cos ( 2 x ) en el dominio[0, 5]. Vamos a calcularlo manualmente:

f ′ ( x ) = 2 xsin ( 2 x ) + sin ( 5 x ) − cos ( 2 x ) + 5 xcos ( 5 x ) f^\prime (x) = 2 x sin(2 x) + sin(5 x) - cos(2x) + 5x cos(5x)F (x)=2 x s en ( 2 x )+s en ( 5 x )porque ( 2x ) _+5 x cos ( 5 x )  令f ′ ( x ) = 0 f^\prime (x) = 0F (x)=Después de 0 , el punto de estancamiento se puede obtener teóricamente, pero no es fácil de calcular. . .

3.2 Análisis desde la perspectiva del algoritmo

  De acuerdo con los escenarios de problemas anteriores y los principios del algoritmo, se deben considerar dos situaciones:
  (1)la solución actual es una solución óptima local, es decir, f ( x ′ ) < f ( x ) f(x^ \prime) < f(x )f ( x )<f ( x ) , conservar la solución óptima local actual y seguir generando nuevas soluciones;
  (2)la solución actual no es una solución óptima local, es decir,f ( x ′ ) ≥ f ( x ) f(x^ \prime) \ f(x)f ( x )f ( x ) , calcule la probabilidad de convergencia de la solución a la temperatura actual, si la probabilidad es mayor que un cierto umbral (aleatorio), entonces la solución se puede usar como una solución óptima local, mantenga la solución y continúe generar una nueva solución, de lo contrario descartar la solución, continuar generando nuevas soluciones.

3.3 implementación de Python

# -*- coding:utf-8 -*-
# Author:   xiayouran
# Email:    [email protected]
# Datetime: 2023/1/16 11:12
# Filename: sa.py
import numpy as np
from matplotlib import pyplot as plt

def f(x):
    return x*np.sin(5*x) - x*np.cos(2*x)

seed = 10086
np.random.seed(seed)

T = 100     # 初始温度
T_end = 1e-3    # 终止温度
coldrate = 0.9    # 冷却系数
max_count = 15  # 每个温度值下的迭代次数
x_range = [0, 5]    # 定义域

if __name__ == '__main__':
    plt.figure()
    plt.ion()
    x_ = np.linspace(*x_range, num=200)
    plt.plot(x_, f(x_))

    x = np.random.uniform(*x_range)  # 初始解
    while T > T_end:
        for _ in range(max_count):
            y = f(x)
            x_new = np.clip(x + np.random.randn(), a_min=x_range[0], a_max=x_range[1])

            # something about plotting
            if 'sca' in globals() or 'sca' in locals():
                sca.remove()
            sca = plt.scatter(x, y, s=100, lw=0, c='red', alpha=0.5)
            plt.pause(0.01)

            y_new = f(x_new)
            if y_new < y:  # 局部最优解
                x = x_new
            else:
                p = np.exp(-(y_new - y) / T)  # 粒子在温度T时趋于平衡的概率为exp[-ΔE/(kT)]
                r = np.random.uniform(0, 1)
                if p > r:  # 以一定概率来接受最优解
                    x = x_new
        T *= coldrate

    plt.scatter(x, f(x), s=100, lw=0, c='green', alpha=0.7)
    plt.ioff()
    plt.show()
    print('最小值对应的坐标点: ({}, {})'.format(x, f(x)))

  La solución óptima obtenida es la siguiente:

最小值对应的坐标点: (3.435632058805234, -6.276735466829619)

  El proceso de simulación es el siguiente:

inserte la descripción de la imagen aquí

Repositorio de código: IALib[GitHub]

  El código de este artículo se ha sincronizado con Pythonel almacén exclusivo de la columna [Algoritmo inteligente (Recurrencia)]: Algoritmos en la biblioteca   de tiempo de ejecución de IALib :
IALibSAA

git clone [email protected]:xiayouran/IALib.git
cd examples
python main.py -algo saa

Supongo que te gusta

Origin blog.csdn.net/qq_42730750/article/details/129523998
Recomendado
Clasificación