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++) p>
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]) p>
{
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 ); p>
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--) p> si (matriz romper; for(j=n-1;j>i;j--) p> si (array[j]>array) break; if(j==i) {/* es el último bucle A*/ p> 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............. ...."); }