Red de conocimiento informático - Aprendizaje de código fuente - Problema del vendedor ¡¡¡Los expertos en programación informática pueden ayudar!!!

Problema del vendedor ¡¡¡Los expertos en programación informática pueden ayudar!!!

Idea: Organizar las n ciudades, encontrar la distancia total correspondiente a cada disposición y luego elegir la más corta.

Corolario: Trate el ciclo hamiltoniano más corto calculado anteriormente como un círculo. Después de calcular el ciclo hamiltoniano más corto, comenzando desde cualquier punto del circuito y visitando cada vértice una vez, la distancia total será igual. Porque la distancia total es igual a la circunferencia del círculo.

Código (es necesario mejorar la eficiencia, porque la mitad de los circuitos se juzgan, es decir, la dirección inversa y la dirección directa de una carretera se juzgan una vez):

int flag =0;/*Utilizar para marcar si la verificación del bucle se ha completado*/

int search(int Distance[5][5],int start,int result[5]);

void next(int array[ ],int n);

void sort(int array[],int start,int end);

int dis_compute(int distancia[5 ][5],int resultado[ 5]);

void chuli(int t_result[],int resultado[],int start,int n);

void main()

{

int i,j,start;/*start representa el número de ciudad del punto de partida*/

int distancia[5][5]={ {0,50,30,7,60 },/*Distancia entre ciudades simuladas*/

{50,0,40,76,89},

{30,40 ,0,10,70},

{70,76,100,0,80},

{90,89,70,80,0}};

int result[5]= {0};/*Almacena el ciclo hamiltoniano más corto*/

int dis_result=0;/*Almacena la distancia total más corta*/

printf ("\nLa distancia de las ciudades es la siguiente:\n");

for(i=0;i<5;i++)

{

for(j=0;j<= i;j++)

printf("%4d",distancia[j]);

printf("\n\n");

}

printf("Ingrese el número de la ciudad para comenzar. Ingrese -1 para salir.\n");

scanf("%d" ,&start);

while(start<-1||start>4)

{

printf("Lo siento, estás equivocado.\nPor favor ingresa el número de ciudad para comenzar. Ingrese -1 para salir.\n");

scanf("%d",&start);

}

if (start==-1)/* -1 significa finalizar el programa*/

{

printf("\nAdiós. ¡Buena suerte!\n");

return;

}

printf("\nOK. ¡¡¡Vamos!!!\n");

dis_result=search(distancia, inicio,resultado);/*Calcule el circuito hamiltoniano más corto y encuentre la distancia total*/

printf("\nLa mejor ruta es:\n");

for(i =0;i<5;i++)

printf("%4d->",resultado);

printf("%4d\n",resultado[0]);

printf("Y todo

la distancia es:%d\n",dis_result);

}

int search(int distancia[5][5],int inicio,int resultado[5])

{

int i,j;

int t_distance,r_distance;

int t_result[5]={0,1,2, 3,4};

int r_result[5];

printf("\nEstoy en la función de búsqueda.....");

p>

t_distance=r_distance=dis_compute(distancia,t_result);

while(bandera==0)

{

siguiente(t_result,5 );

chuli(t_result,r_result,start,5);

if((t_distance=dis_compute(distance,r_result))

{ /*Si el la distancia total del bucle actual es la más pequeña entre los bucles marcados*/

r_distance=t_distance;

chuli(t_result,result,start,5);

}

}

printf("\nEstoy saliendo de la función de búsqueda.............");

return r_distance;

}

void next(int array[],int n)

{ /*Calcula el siguiente bucle posible, que en realidad es Encuentra la disposición */

int i,j,temp;

printf("\nEstoy en la siguiente función............ ...... ....");

flag=0;

for(i=n-2;i>=0;i--)

si (matriz

romper;

for(j=n-1;j>i;j--)

si (array[j]>array)

break;

if(j==i)

{/* es el último bucle A*/

bandera=1;

retorno;

}

temp=matriz;

matriz=matriz[j] ;

array[j]=temp;

sort(array,i+1,n);

printf("\ nEstoy dejando la siguiente función. ........");

}

clasificación vacía(int matriz[],int start,int end)

{

int i,j;

printf("\nEstoy en la función de clasificación. ........ .................");

for(i=start;i

for(j =inicio;j

p>

if(array[j]>array[j+1])

{

int t=array[j];

array [j]=array[j+1];

array[j+1]=t;

}

printf("\nEstoy saliendo de sort función.................................");

}

int dis_compute (int distancia[5][5],int resultado[5])

{/*Calcular la distancia total correspondiente al bucle actual*/

int r_distance=0;

int i;

printf("\nEstoy en la función dis_compute........................" );

for(i=0;i<5;i++)

r_distance+=distancia[resultado][resultado[(i+1)%5]];

printf("\nEstoy saliendo de la función dis_compute.............");

return r_distance;

}

void chuli(int t_result[],int result[],int start,int n)

{/*Reorganiza los bucles seleccionados según el punto de partida----> Ruta-- -->Orden de los puntos de partida*/

int i,pos;

printf("\nEstoy en la función chuli..... ........ .............");

for(i=0;i

si (t_result==start)

descanso;

pos=i;

for(i=0;i

resultado=t_result[( pos+i)%n];

printf("\nEstoy saliendo de la función chuli............. ....");

}