Implementación de Matlab basada en recocido simulado y problema tsp

Este artículo ha participado en la actividad "Ceremonia de creación de recién llegados", y hemos iniciado juntos el camino de la creación de Nuggets.

Definición y diagrama de flujo

El algoritmo de recocido simulado se deriva del principio de recocido sólido. Es un algoritmo basado en la probabilidad. El sólido se calienta a un nivel suficientemente alto y luego se enfría lentamente. Durante el calentamiento, las partículas dentro del sólido se desordenan con el aumento de temperatura, y la energía interna aumenta, sin embargo, cuando las partículas se enfrían gradualmente, alcanzan un estado de equilibrio en cada temperatura, y finalmente alcanzan el estado fundamental a temperatura ambiente, y la energía interna se reduce al mínimo. ==Este es un sitio web de divulgación científica sobre recocido simulado== Recocido simulado El recocido simulado se divide principalmente en tres partes: 1. Proceso de calentamiento. Su propósito es mejorar el movimiento térmico de las partículas alejándolas de la posición de equilibrio. Cuando la temperatura es lo suficientemente alta, el sólido se derretirá en un líquido, eliminando así el estado no homogéneo preexistente del sistema. 2. Proceso isotérmico. Para un sistema cerrado que intercambia calor con el ambiente circundante y la temperatura es constante, el cambio espontáneo del estado del sistema es siempre en la dirección de la disminución de la energía libre.Cuando la energía libre es la más pequeña, el sistema alcanza un estado de equilibrio. 3. Proceso de enfriamiento. El movimiento térmico de las partículas se debilita, la capacidad del sistema se reduce y se obtiene la estructura cristalina. Como algoritmo inteligente, el recocido simulado se puede usar para encontrar el valor óptimo de algunos problemas complejos. Por ejemplo, se puede usar bien en el problema tsp. A continuación, el autor implementa el problema tsp basado en el recocido simulado en Matlab, de modo que los lectores pueden tener una comprensión más profunda de la simulación El proceso de recocido.inserte la descripción de la imagen aquí

Temas y Análisis

Aquí está el ejemplo de tsp del enlace del título , el título está en inglés, los lectores pueden usar la traducción de Baidu para traducirlo. tema:inserte la descripción de la imagen aquí

Análisis: Primero generamos una matriz con 0 para cada elemento excepto aquellas posiciones de elementos con n piedras. Las posiciones de estos elementos distintos de 0 son las coordenadas a las que se moverá nuestro bulldozer. Según los requisitos del título, hay 10 elementos distintos de 0 (otros problemas son similares, cambiar los datos u otros pequeños detalles). Encuentre el camino más corto a través de todos los puntos, que se puede transformar en un problema tsp, por lo que es muy familiar. Sin más preámbulos, mire el código ==Matlab==:

codigo y resultado

Para obtener un código detallado, consulte mi sitio web: Código detallado

clear
clc
T0 = 1000;      % 起始温度
Tend = 1e-3;    % 终止温度
L = 200;    % 各温度下的迭代次数
q = 0.9;    % 降温速率
position = [2 8
    1 1
    5 9
    10 3
    4 5
    7 1
    3 2
    6 4
    5 5
    9 3];

% 计算各点之间的距离矩阵
[m,n] = size(position);
D = zeros(m);
for i = 1:m
    for j = 1:m
        if i == j
            D(i,j) = 0;
        else
            D(i,j) = sqrt((position(i,1)-position(j,1))^2+(position(i,2)-position(j,2))^2);
        end
    end
end

s1 = randperm(m); % 产生一个解、画图并输出路径
drawpath(s1,position);
disp('一可行解的路径')
outputpath(s1);
r = pathlength(D,s1);
disp(['回路长度为:',num2str(r)]);
count = 0;

% 开始迭代
while T0 > Tend
    temp = zeros(L,m+1);
    count = count + 1;
    for k = 1:L
        s2 = newanswer(s1);
        [s1,r] = metropolis(s1,s2,D,T0);
        temp(k,:) = [s1,r];
    end
    % 记录每次迭代的最优路线
    [~,index] = min(temp(:,end));
    record(count) = temp(index,end);
    track(count,:) = temp(index,1:end-1); 
    T0 = q*T0;
end
% 画图显示结果
[~,tip] = min(record);
drawpath(track(tip,:),position);
hold on 
title('最优路线')
figure
hold on
plot(1:count,record)
xlabel('迭代次数')
ylabel('距离')
title('优化过程')
disp(['最优路径与距离',num2str(record(tip))])
outputpath(track(tip,:));

Para obtener un código detallado, consulte mi sitio web: Código detallado inserte la descripción de la imagen aquí inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquíLa Figura 1 es una solución arbitraria, la Figura 2 es la solución óptima obtenida por el algoritmo de recocido simulado y la Figura 3 es el proceso de optimización de la distancia en el proceso iterativo. En la figura se puede ver que finalmente se encuentra la solución óptima, lo que indica que el recocido simulado es una buena manera de resolver este problema.

Supongo que te gusta

Origin juejin.im/post/7117819043888758797
Recomendado
Clasificación