Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Problema con el viajante de comercio

Estas en el tema de Problema con el viajante de comercio en el foro de C/C++ en Foros del Web. La idea de mi siguiente codigo es recorrer una matriz 4x4 rellenada cada posicion con las distancias entre las ciudades. Quien conozca el problema del ...
  #1 (permalink)  
Antiguo 30/04/2014, 19:21
 
Fecha de Ingreso: octubre-2013
Mensajes: 5
Antigüedad: 11 años, 1 mes
Puntos: 0
Pregunta Problema con el viajante de comercio

La idea de mi siguiente codigo es recorrer una matriz 4x4 rellenada cada posicion con las distancias entre las ciudades. Quien conozca el problema del viajante de comercio le sonara, pero la idea basica es ir elegiendo la ciudad mas cercana a una ciudad v0 elegida, que para mi es el primer valor.

Les muestro mi codigo
Código C++:
Ver original
  1. int matriz[n][n];
  2. int minimo;
  3. list <int> vertice;//Subconjunto solución
  4.  
  5. /*--------------------------------------------------*/
  6. // Rellenamos matriz a ceros
  7.  
  8. for(int i=0; i<n; i++){
  9.     for(int j=0; j<n; j++){
  10.               matriz[i][j] = 0;
  11.     }
  12. }
  13.  
  14. matriz[0][1]=5;
  15. matriz[0][2]=2;
  16. matriz[0][3]=3;
  17. matriz[1][0]=5;
  18. matriz[1][2]=4;
  19. matriz[1][3]=5;
  20. matriz[2][0]=2;
  21. matriz[2][1]=4;
  22. matriz[2][3]=1;
  23. matriz[3][0]=3;
  24. matriz[3][1]=5;
  25. matriz[3][2]=1;
  26.  
  27. bool aumento;
  28. int contador;
  29. int contador2;
  30. int val1,val2;
  31.  
  32. for(int i=0; i<n; i=val2){
  33.     aumento = true;
  34.     contador2 = 0;
  35.     for(int j=0; j<n; j++){
  36.  
  37.         if (aumento){
  38.             contador = 0;
  39.  
  40.             while (matriz[i][contador]==0){
  41.                 contador++;
  42.             }
  43.  
  44.             minimo = matriz[i][contador];
  45.             //cout << "\nMINIMO INICIAL EN FILA " << i << " : " << minimo << endl;
  46.             aumento = false;
  47.         }
  48.        
  49.         contador2++;
  50.         if(matriz[i][j]!=0){
  51.             if(matriz[i][j] < minimo){
  52.                 minimo = matriz[i][j];
  53.                 val1 = i;
  54.                 val2 = j;
  55.                 //cout << "MINIMO DE LA FILA " << i << ": " << minimo << endl;
  56.                 cout << "POSICION " << "("<<val1<<","<<val2<<")"<<endl;
  57.                
  58.             }
  59.         }
  60.         //cout << "CONTADOR2 : " << contador2 << endl;
  61.    
  62.         if (contador2 == n){
  63.  
  64.             vertice.push_back(val1);
  65.                 vertice.push_back(val2);
  66.  
  67.              for(int j=0; j<n; j++){
  68.  
  69.                           matriz[j][val1]=0;
  70.                           matriz[j][val2]=0;
  71.             }
  72.  
  73.             // cout << "POSICION " << "("<<val1<<","<<val2<<")"<<endl;
  74.         }
  75.     }
  76. }

Lo esencial del problema. Segun la matriz que he introducido, deberia calcular el minimo de la primera fila, excluyendo siempre el cero, seleccionar el 0,2 que es el minimo y borrar las columnas de ambos numeros. Luego iria a la fila 2, buscaria el minimo que esta en el 2,3 y borraria de nuevo columnas. El problema es que a partir de ahi no avanza y entra en bucle cuando deberia seguir con 3,1 y acabar ...
  #2 (permalink)  
Antiguo 30/04/2014, 22:23
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Problema con el viajante de comercio

Podrias explicar, de la linea 32, la idea detras de hacer i = val2 ?
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 01/05/2014, 02:48
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 1 mes
Puntos: 38
Respuesta: Problema con el viajante de comercio

jeje calgary como siempre... el ojo afilado =D, seguramente el problema este ahí XDDD
Se dejan el código por la mitad y cree que vamos a poder ayudar de esta forma.
  #4 (permalink)  
Antiguo 01/05/2014, 03:39
 
Fecha de Ingreso: octubre-2013
Mensajes: 5
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Problema con el viajante de comercio

Es lo que pensaba que podía estar mal, la verdad xD. Con i=val2 quiero que ese bucle empiece con i=0. Cuando encuentre el (0,2), el 2 en la siguiente iteración, luego de encontrar el (2,3), el 3 ... así.

El código está completo, vangodp, el resto son otros apartados que no influyen en esto :/
  #5 (permalink)  
Antiguo 01/05/2014, 05:38
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Problema con el viajante de comercio

Creo que el problema esta aqui:
1- Haces un ciclo inicial en el que descubres el primero distinto que 0, lo consideras minimo
2- Comparas el resto contra el minimo y actualizas el minimo si alguno de ellos es menor que el elegido en el paso anterior. Actualizas val1 y val2 cuando ello ocurre.
3- Luego actualizas la matriz para que nadie pueda visitar ni las ciudades val1 o val2 nuevamente.

Todo eso parece estar bien, el problema esta que en 3) cada vez 2) tiene menos que recorrer. En la "ultima" iteracion, 2) nunca se ejecuta, por lo que el minimo que elegiste en 1) se queda.

Consecuencia de esto es que val1 y val2 no son actualizados y se mantiene lo dicho en la vuelta anterior.

Sugiero actualizar val1 y val2 al calcular el minimo inicial.
__________________
Visita mi perfil en LinkedIn
  #6 (permalink)  
Antiguo 01/05/2014, 05:40
 
Fecha de Ingreso: octubre-2013
Mensajes: 5
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Problema con el viajante de comercio

Exacto, era eso, ya funciona correctamente. Muchísimas gracias ^^
  #7 (permalink)  
Antiguo 02/05/2014, 10:50
Avatar de nup_  
Fecha de Ingreso: noviembre-2010
Mensajes: 265
Antigüedad: 14 años
Puntos: 32
Respuesta: Problema con el viajante de comercio

Hola:

Solo agregar q el algoritmo q usas no es la solución exacta al problema del viajante, usualmente da una solución más o menos buena pero a veces puede darte la peor.

slds;

nup_

Etiquetas: comercio, matriz
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:41.