Algoritmo genético para resolver el problema urbano de TSP

1. Introducción al algoritmo genético y TSP

1. El algoritmo genético es un modelo computacional que simula el proceso de selección natural de la evolución biológica de Darwin y el mecanismo evolutivo de la genética, y es un método de búsqueda de la solución óptima mediante la simulación del proceso de evolución natural. El algoritmo genético comienza con una población que representa el conjunto de soluciones potenciales del problema, y ​​una población está compuesta de un cierto número de individuos codificados genéticamente. Cada individuo es en realidad una entidad con un cromosoma característico. Como el principal portador de material genético, es decir, la colección de múltiples genes, la expresión interna (es decir, el genotipo) es una cierta combinación de genes, que determina la expresión externa de la forma del individuo. Por lo tanto, al principio, el mapeo del fenotipo al genotipo, es decir, la codificación, debe realizarse. Después de la generación de la población de primera generación, de acuerdo con los principios de supervivencia del más apto y la supervivencia del más apto, las generaciones evolutivas producen mejores y mejores soluciones aproximadas. En cada generación, el cuerpo se selecciona de acuerdo con la aptitud del individuo en el dominio del problema, y ​​con la ayuda de la genética natural. Los operadores genéticos combinan cruces y mutaciones para producir poblaciones que representan nuevos conjuntos de soluciones. Este proceso hará que la descendencia de la población se adapte más al medio ambiente que la generación anterior. Los individuos óptimos en la última población se decodifican y pueden usarse como la solución óptima aproximada al problema.
El proceso básico se muestra en la figura a continuación:
Inserte la descripción de la imagen aquí
2. El problema del vendedor ambulante, es decir, el problema TSP (problema del vendedor ambulante) también se traduce en el problema del vendedor ambulante y el problema del vendedor, que es uno de los problemas conocidos en el campo de las matemáticas. Supongamos que un hombre de negocios que viaja quiere visitar n ciudades, debe elegir el camino que desea tomar. La limitación del camino es que cada ciudad solo puede visitar una vez y finalmente regresar a la ciudad de partida original. El objetivo de selección de ruta es que la distancia de ruta requerida es el valor mínimo entre todas las rutas.

Segundo, el principio básico del algoritmo genético.

El algoritmo genético es un tipo de método de búsqueda aleatoria que toma prestado de las leyes evolutivas del mundo biológico (supervivencia del más apto, supervivencia del más apto), su característica principal es operar directamente sobre objetos estructurales, no hay límite de continuidad de función y derivación Tiene un paralelismo implícito inherente y una mejor capacidad de optimización global. Adopta un método de optimización probabilístico, que puede obtener y guiar automáticamente el espacio de búsqueda optimizado, y ajustar adaptativamente la dirección de búsqueda sin la necesidad de ciertas reglas.

3. Los principales pasos del algoritmo genético.

1. Población inicial: varias soluciones se generan aleatoriamente dentro del dominio factible, y se denominan población inicial.
2. Evaluar la idoneidad de cada solución en la población y evaluar qué tan bien se adapta cada individuo al medio ambiente.
3. Supervivencia del más apto, eliminación de lo inadecuado, uso de números aleatorios y otros métodos para eliminar individuos inadecuados, adecuados para la retención.
4. Perturbar la nube mediante intercambios cruzados, mutaciones, etc., en esencia, buscar dentro del dominio factible para encontrar la solución más adecuada para el medio ambiente.
El entorno anterior se refiere a la función objetivo, la función que necesita resolver el valor óptimo, cada individuo es cada solución factible, la evaluación de aptitud es llevar la solución factible a la función para el cálculo y luego comparar su tamaño, si la solución factible se sustituye en la función, el resultado es el más Excelente, entonces esta solución es la solución óptima. La supervivencia del más apto es la retención de soluciones excelentes, la eliminación de soluciones pobres, el cruce y la mutación es perturbar las soluciones para mejorar aún más la superioridad de las soluciones.

Cuarto, las características de los algoritmos genéticos.

1. Los algoritmos genéticos solo operan en genes individuales, por lo que no importa cuán complicado sea el problema real, su estabilidad no se verá muy afectada.
2. El proceso de búsqueda del algoritmo genético pertenece a la computación paralela y puede buscar bien en el espacio de la solución.
3. Fuerte estabilidad y robustez, adecuado para problemas de optimización complejos no lineales y de alta dimensión.

Cinco, módulo de código de implementación de algoritmo

1. Función de dibujo de punto par plot_route.m

function plot_route(a,R)
scatter(a(:,1),a(:,2),'rx');
hold on;
plot([a(R(1),1),a(R(length(R)),1)],[a(R(1),2),a(R(length(R)),2)]);
hold on;
for i=2:length(R)
    x0=a(R(i-1),1);
    y0=a(R(i-1),2);
    x1=a(R(i),1);
    y1=a(R(i),2);
    xx=[x0,x1];
    yy=[y0,y1];
    plot(xx,yy);
    hold on;
end

end

2. Función de costo de distancia cromosómica mylength.m

function len=myLength(D,p)%p是一个排列
[N,NN]=size(D);
len=D(p(1,N),p(1,1));
for i=1:(N-1)
    len=len+D(p(1,i),p(1,i+1));
end
end

3. Función fitness fit.m

function fitness=fit(len,m,maxlen,minlen)
fitness=len;
for i=1:length(len)
    fitness(i,1)=(1-(len(i,1)-minlen)/(maxlen-minlen+0.0001)).^m;
end

4. Función de operación cruzada cross.m

function [A,B]=cross(A,B)
L=length(A);
if L<10
    W=L;
elseif ((L/10)-floor(L/10))>=rand&&L>10
    W=ceil(L/10)+8;
else
    W=floor(L/10)+8;
end
%%W为需要交叉的位数
p=unidrnd(L-W+1);%随机产生一个交叉位置
%fprintf('p=%d ',p);%交叉位置
for i=1:W
    x=find(A==B(1,p+i-1));
    y=find(B==A(1,p+i-1));
    [A(1,p+i-1),B(1,p+i-1)]=exchange(A(1,p+i-1),B(1,p+i-1));
    [A(1,x),B(1,y)]=exchange(A(1,x),B(1,y));
end

end

5. Función de intercambio exchange.m

function [x,y]=exchange(x,y)
temp=x;
x=y;
y=temp;
 
end

6. Función de mutación Mutation.m

function a=Mutation(A)
index1=0;index2=0;
nnper=randperm(size(A,2));
index1=nnper(1);
index2=nnper(2);
%fprintf('index1=%d ',index1);
%fprintf('index2=%d ',index2);
temp=0;
temp=A(index1);
A(index1)=A(index2);
A(index2)=temp;
a=A;

end

7. Función principal

%main
clear;
clc;
%%%%%%%%%%%%%%%输入参数%%%%%%%%
N=25;               %%城市的个数
M=100;               %%种群的个数
ITER=2000;               %%迭代次数
%C_old=C;
m=2;                %%适应值归一化淘汰加速指数
Pc=0.8;             %%交叉概率
Pmutation=0.05;       %%变异概率
%%生成城市的坐标

pos=randn(N,2);  
%randn是一种产生标准正态分布的随机数或矩阵的函数,属于MATLAB函数
%返回一个N*2的随机项的矩阵。如果N不是个数量,将返回错误信息。

%%生成城市之间距离矩阵
D=zeros(N,N);
%zeros(N,N)产生N×N的double类零矩阵
for i=1:N
    for j=i+1:N
        dis=(pos(i,1)-pos(j,1)).^2+(pos(i,2)-pos(j,2)).^2;
        D(i,j)=dis^(0.5);
        D(j,i)=D(i,j);
    end
end

%%生成初始群体

popm=zeros(M,N);
%zeros(M,N)产生M×N的double类零矩阵
for i=1:M
    popm(i,:)=randperm(N);%随机排列,比如[2 4 5 6 1 3]
end
%%随机选择一个种群
R=popm(1,:);
figure(1);
scatter(pos(:,1),pos(:,2),'rx');%画出所有城市坐标
axis([-3 3 -3 3]);
figure(2);
plot_route(pos,R);      %%画出初始种群对应各城市之间的连线
axis([-3 3 -3 3]);
%%初始化种群及其适应函数
fitness=zeros(M,1);
len=zeros(M,1);

for i=1:M%计算每个染色体对应的总长度
    len(i,1)=myLength(D,popm(i,:));
end
maxlen=max(len);%最大回路
minlen=min(len);%最小回路

fitness=fit(len,m,maxlen,minlen);
rr=find(len==minlen);%找到最小值的下标,赋值为rr
R=popm(rr(1,1),:);%提取该染色体,赋值为R
for i=1:N
    fprintf('%d ',R(i));%把R顺序打印出来
end
fprintf('\n');

fitness=fitness/sum(fitness);
distance_min=zeros(ITER+1,1);  %%各次迭代的最小的种群的路径总长
nn=M;
iter=0;
while iter<=ITER
    fprintf('迭代第%d次\n',iter);
    %%选择操作
    p=fitness./sum(fitness);
    q=cumsum(p);%累加
    for i=1:(M-1)
        len_1(i,1)=myLength(D,popm(i,:));
        r=rand;
        tmp=find(r<=q);
        popm_sel(i,:)=popm(tmp(1),:);
    end 
    [fmax,indmax]=max(fitness);%求当代最佳个体
    popm_sel(M,:)=popm(indmax,:);

    %%交叉操作
    nnper=randperm(M);
%    A=popm_sel(nnper(1),:);
 %   B=popm_sel(nnper(2),:);
    %%
    for i=1:M*Pc*0.5
        A=popm_sel(nnper(i),:);
        B=popm_sel(nnper(i+1),:);
        [A,B]=cross(A,B);
  %      popm_sel(nnper(1),:)=A;
  %      popm_sel(nnper(2),:)=B; 
         popm_sel(nnper(i),:)=A;
         popm_sel(nnper(i+1),:)=B;
    end

    %%变异操作
    for i=1:M
        pick=rand;
        while pick==0
             pick=rand;
        end
        if pick<=Pmutation
           popm_sel(i,:)=Mutation(popm_sel(i,:));
        end
    end

    %%求适应度函数
    NN=size(popm_sel,1);
    len=zeros(NN,1);
    for i=1:NN
        len(i,1)=myLength(D,popm_sel(i,:));
    end

    maxlen=max(len);
    minlen=min(len);
    distance_min(iter+1,1)=minlen;
    fitness=fit(len,m,maxlen,minlen);
    rr=find(len==minlen);
    fprintf('minlen=%d\n',minlen);
    R=popm_sel(rr(1,1),:);
    for i=1:N
        fprintf('%d ',R(i));
    end
    fprintf('\n');
    popm=[];
    popm=popm_sel;
    iter=iter+1;
    %pause(1);

end
%end of while

figure(3)
plot_route(pos,R);
axis([-3 3 -3 3]);
figure(4)
plot(distance_min);

Sexto, la variable de control analiza la influencia de cada parámetro en la solución.

1. El efecto del tamaño de la población en la solución Los
parámetros constantes son los siguientes:
N = 25; //
Número de ciudades ITER = 2000; / Número de iteraciones
m = 2; // Índice de aceleración de adaptación normal
Pc = 0.8; / / Probabilidad de cruce
Pmutación = 0.05; // Probabilidad de mutación
①M = 20; //
Inserte la descripción de la imagen aquí
Número de población ②M = 50; //
Inserte la descripción de la imagen aquí
Número de población ③M = 100; // Número de población
Inserte la descripción de la imagen aquí
Conclusión: cuanto mayor sea el tamaño de la población, más resultados tendrá el algoritmo Preciso, mejor es la adaptabilidad, pero mayor es el tiempo de ejecución.
2. El efecto del número de iteraciones en la solución Los
parámetros constantes son los siguientes:
N = 25; // Número de ciudades
M = 100; // Número de poblaciones
m = 2; // Índice de aceleración de adaptación normal
Pc = 0.8; // probabilidad cruzada
Pmutación = 0.05; // probabilidad de mutación
①ITER = 1000; / número de iteraciones
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
②ITER = 1500; / número de iteraciones
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
③ITER = 2000; / número de
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
iteraciones Cuanto mayor sea el número de iteraciones, mayor será la tasa correcta de la solución. Cuando el número de iteraciones alcanza 1000, el resultado de ejecución del algoritmo tiende a ser estable (el camino más corto se obtiene de manera estable), y la eficiencia del algoritmo es relativamente alta. El número óptimo de iteraciones del algoritmo es 2000.
3. El efecto del número de ciudades en la solución Los
parámetros constantes son los siguientes:
M = 100; // Número de población
ITER = 2000; / Número de iteraciones
m = 2; // Índice de eliminación normalizado
Pc = 0.8; // probabilidad cruzada
Pmutation = 0.05; // probabilidad de mutación
①N = 15; // número de ciudades
Inserte la descripción de la imagen aquí
②N = 20; // número de ciudades
Inserte la descripción de la imagen aquí
③N = 25; // número de ciudades
Inserte la descripción de la imagen aquí
Conclusión: Cuando la ciudad Cuando hay un gran número, más de 50 ciudades, después de múltiples iteraciones, GA aún no converge. El posible problema es que está atascado en la solución óptima local
. 4. El efecto de la probabilidad de cruce en la solución Los
parámetros constantes son los siguientes:
N = 25; // ciudad el número de
m = 100; // número de población
ITER = 2,000; / iteraciones
m = 2; // cabo valores de adaptación fueron el índice de aceleración normalizada
Pmutation = 0,05; // mutación probabilidad
①Pc = 0,6; // probabilidad de cruce
Inserte la descripción de la imagen aquí
②Pc = 0.7; // Probabilidad de cruce
Inserte la descripción de la imagen aquí
③Pc = 0.8; // Probabilidad de cruce
Inserte la descripción de la imagen aquí
Conclusión: Si la probabilidad de cruce es demasiado baja, no se obtendrá la solución óptima: cuanto mayor sea la probabilidad de cruce, mejor será la aptitud promedio.
5. El efecto de la probabilidad de mutación en la solución Los
parámetros constantes son los siguientes:
N = 25; // Número de ciudades
M = 100; //
Número de poblaciones ITER = 2000; / Número de iteraciones
m = 2; // Valor de retorno adaptativo Índice de aceleración de eliminación uniforme
Pc = 0.8; // probabilidad cruzada
①Pmutación = 0.01; // probabilidad de mutación
Inserte la descripción de la imagen aquí
②Pmutación = 0.05; // probabilidad de mutación
Inserte la descripción de la imagen aquí
③Pmutación = 0.1; // probabilidad de mutación
Inserte la descripción de la imagen aquí
Conclusión: Una probabilidad de mutación demasiado alta o demasiado baja afectará la solución óptima.

7. Resumen

Dado que la estrategia de búsqueda general del algoritmo genético y el cálculo de optimización no se basan en la información del gradiente, solo se necesitan la función objetivo y la función de aptitud correspondiente que afectan la dirección de búsqueda, por lo que se usa ampliamente. La combinación de la optimización de problemas a gran escala usando el cálculo genético es un método más efectivo, porque es difícil resolver la solución óptima usando el método de enumeración en el cálculo actual. Sin embargo, el algoritmo genético también tiene defectos: no tiene un método de análisis cuantitativo efectivo para la precisión, factibilidad y complejidad computacional del algoritmo. A través del algoritmo en este documento, podemos darnos cuenta claramente de que la solución obtenida por el algoritmo genético no es necesariamente la solución óptima.

11 artículos originales publicados · Me gusta0 · Visitas 1040

Supongo que te gusta

Origin blog.csdn.net/likepanda99/article/details/103142786
Recomendado
Clasificación