Red de conocimiento informático - Aprendizaje de código fuente - En el modelado matemático, si un número determinado de nodos es muy grande, ¿cuál es un buen algoritmo que se puede utilizar para encontrar el camino más corto (similar a un camino en línea recta) a través de estos nodos?

En el modelado matemático, si un número determinado de nodos es muy grande, ¿cuál es un buen algoritmo que se puede utilizar para encontrar el camino más corto (similar a un camino en línea recta) a través de estos nodos?

Este es un fragmento de código que escribí yo mismo para encontrar el camino más corto en una línea recta que contiene más de 2000 puntos. Es muy rápido, más rápido que la genética y las colonias de hormigas, y más corto que el camino más corto. Puedes probarlo y preguntarme si tienes alguna duda.

función [S, len]=short(P)

Este programa se utiliza para encontrar el camino más corto entre puntos del mismo tipo

P representa una cierto tipo La matriz de coordenadas del punto

p es la ruta más corta

d es la suma de los pesos de la ruta

Crea una matriz de pesos

n= longitud( P); encuentra el número de puntos de este tipo

W=zeros(n,n);

para i=1:n calcula el peso y llene la matriz de peso porque los puntos están conectados, por lo que la matriz de peso es la matriz de ruta más corta del gráfico

para j=(i 1): n

W(i , j)=sqrt((P((i, 1)-P(j))-P(j))-P(j))-P(j)-P(j)-P(j,1)- P(j)-P(j)-P(i,1))-P(j)-P(j)-P(j)-P(j))i,1)-P(j,1)) ^2 (P(i,2)-P( j, 2))^2);

fin

fin

para i=2: n

para j=1: (i-1)

W(i,j)=W(j,i);

fin

fin<

Encuentre el camino más corto a través de todos los puntos

Encuentre el camino más corto desde el punto i al punto j. El camino debe pasar por los otros n-2 puntos especificados y. seleccione la ruta más corta entre ellos

S=zeros(1,n);

S(1)=1 Inserte los puntos 1 y 2 primero, y luego inserte un nuevo punto en cada uno; tiempo basado en esto

S( 2)=2;

S(2)=1; Inserte los puntos 1 y 2 primero, y luego inserte un nuevo punto cada vez.

2;

d1=2*W(1,2);

para i=3: n marca del nuevo punto de inserción

d1i=zeros( 1, i); Inserta el i-ésimo punto, hay i distancias posibles, la distancia más pequeña será d1 de esta ronda

para j=1: La posición del i punto recién agregado, inserta el i-th El punto es seleccionar el punto con i vacantes

si j==1 inserta la primera vacante

d1i(j)=d1 W(i, S(1) ) W( i,S(i-1))-W(S(1))-W(S(S(1)),S(i-1)); inserte el punto en el primer extremo, la distancia será sea ​​la distancia original y la última La suma de las distancias entre el punto en la posición i y el punto en la posición 1 después de una inserción

end

if jgt 1 amp; i Inserte la posición vacía en el medio

d1i(j)=d1 W(S(j-1),i) W(i,S(j))-W(S(j-1) ,S(j));

p>

fin

si j==i

d1i(j)= d1 W(S(i-1) ,i) W(S(1),i )-W(S(1), S(i-1));

fin

fin

[d1, I]=min(d1i) ;

S((I 1):i)=S(I: (i-1)); Mueve el punto después del I-ésimo dígito hacia atrás. un dígito

p> S(I)=i; inserte el punto i en la posición I

end

len=d1;

El siguiente código es lo que uso para guardar el archivo txt de resultados anterior si lo necesita. Este código no se modificó la última vez que lo usé. Puede cambiarlo según sea necesario.

borrar

cerrar todo

clc

cargar datos

X=[C;E;I;J ];

[S, len]=short(X);

DrawPath(S, X);

print(1,'-dpng', 'cmeiju3.png');

Guardar los resultados en un archivo txt

fid=fopen('cmeijulujin.txt', 'wt'); Crear archivo alunjin.txt

p>

fid=fopen('cmeijulujin.txt', 'wt'); p>

fprintf(fid,'c No. herramienta\n');

fprintf(fid,'d d\n',X(S));

save('cmeijus','S');

save('cmeijulen','len' );

fid=fopen('cmeijulujin.