Ver Mensaje Individual
  #4 (permalink)  
Antiguo 13/01/2016, 03:30
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Necesito orientacion con el siguiente codigo

Un grafo es lo que tienes en la imagen que has puesto en el mensaje: Una serie de nodos unidos entre ellos. Vale, puede ser una descripción un poco vaga pero para lo que necesitas sirve.

Los pesos los puedes interpretar como el coste de llegar de un nodo A a otro B mediante la unión que los une. El peso no tiene unidades y es, por tanto, algo abstracto. Puede significar lo que tu quieras: distancia (mayor peso mayor distancia. p.ej: 1peso=1metro), tiempo para cruzar la unión (mayor peso mayor tiempo. p.ej: 1peso=1minuto), ...

Todo lo anterior, repito, cubre únicamente una parte de la temática de los grafos, pero con eso ya se podría empezar a trabajar en el ejercicio.

En el caso del ejercicio de tu hija, para que tenga algo de sentido, puedes entender que los pesos significan tiempo y te están pidiendo que encuentres una ruta en la que se inviertan 84 minutos.

Para orientarse en un grafo hay que usar algoritmos de encaminamiento. Estos algoritmos permiten calcular rutas más o menos óptimas entre dos puntos cualesquiera del grafo.

En cualquier caso estos algoritmos suelen hacer uso intensivo de listas y árboles, ya que suelen tantear varias rutas antes de elegir la que creen más óptima.

He sacado un ratillo y me ha picado el gusanillo. Un código que navega por un grafo y busca una ruta con el peso pedido:

Código C++:
Ver original
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. struct Posicion
  6. {
  7.   size_t fila;
  8.   size_t columna;
  9.  
  10.   Posicion(size_t fila, size_t columna)
  11.     : fila(fila),
  12.       columna(columna)
  13.   { }
  14.  
  15.   bool operator==(const Posicion& otra) const
  16.   {
  17.     return (fila == otra.fila) && (columna == otra.columna);
  18.   }
  19. };
  20.  
  21. using Ruta = std::vector<Posicion>;
  22.  
  23. class Grafo
  24. {
  25.     std::vector<int> _valores;
  26.     size_t _numFilas;
  27.     size_t _numColumnas;
  28.  
  29.   public:
  30.     Grafo(size_t filas, size_t columnas, int* valores)
  31.       : _numFilas(filas),
  32.         _numColumnas(columnas)
  33.     {
  34.       // Copiamos los datos en el grafo
  35.       _valores.reserve(filas*columnas);
  36.       for( size_t i=filas*columnas; i>0; --i)
  37.       {
  38.         _valores.push_back(*valores);
  39.         ++valores;
  40.       }
  41.     }
  42.  
  43.     size_t NumFilas() const
  44.     { return _numFilas; }
  45.  
  46.     size_t NumColumnas() const
  47.     { return _numColumnas; }
  48.  
  49.     int Valor(const Posicion& posicion) const
  50.     { return _valores[posicion.fila * _numColumnas + posicion.columna]; }
  51. };
  52.  
  53. // Verifica que la nueva posición es válida.
  54. // Se entiende que es válida si está dentro de los límites del grafo
  55. // y si la posición no ha sido usada.
  56. bool PosicionValida(
  57.     const Grafo& grafo,
  58.     const Ruta& ruta,
  59.     const Posicion& nuevaPosicion)
  60. {
  61.   auto toReturn = (nuevaPosicion.fila < grafo.NumFilas());
  62.  
  63.   if( toReturn )
  64.     toReturn = (nuevaPosicion.columna < grafo.NumColumnas());
  65.  
  66.   if( toReturn )
  67.   {
  68.     auto it = std::find(ruta.begin(),ruta.end(),nuevaPosicion);
  69.     toReturn = (it == ruta.end());
  70.   }
  71.  
  72.   return toReturn;
  73. }
  74.  
  75. bool BuscarRuta(
  76.     const Grafo& grafo,
  77.     const Posicion& nuevaPosicion,
  78.     const Posicion& destino,
  79.     Ruta& ruta,
  80.     int pesoActual,
  81.     int pesoEsperado)
  82. {
  83.   auto toReturn = false;
  84.  
  85.   if( PosicionValida(grafo,ruta,nuevaPosicion) )
  86.   {
  87.     ruta.push_back(nuevaPosicion);
  88.     auto nuevoPeso = grafo.Valor(nuevaPosicion);
  89.     pesoActual += nuevoPeso;
  90.  
  91.     if( nuevaPosicion == destino )
  92.       toReturn = pesoActual == pesoEsperado;
  93.     else if( pesoActual >= pesoEsperado )
  94.       toReturn = false;
  95.     else
  96.     {
  97.       //  Intentamos avanzar hacia arriba
  98.       auto nueva = Posicion(nuevaPosicion.fila-1,nuevaPosicion.columna);
  99.       toReturn = BuscarRuta(grafo,nueva,destino,ruta,pesoActual,pesoEsperado);
  100.  
  101.       if( !toReturn )
  102.       {
  103.         // Intentamos avanzar hacia la derecha
  104.         auto nueva = Posicion(nuevaPosicion.fila,nuevaPosicion.columna+1);
  105.         toReturn = BuscarRuta(grafo,nueva,destino,ruta,pesoActual,pesoEsperado);
  106.       }
  107.  
  108.       if( !toReturn )
  109.       {
  110.         // Intentamos avanzar hacia abajo
  111.         auto nueva = Posicion(nuevaPosicion.fila+1,nuevaPosicion.columna);
  112.         toReturn = BuscarRuta(grafo,nueva,destino,ruta,pesoActual,pesoEsperado);
  113.       }
  114.  
  115.       if( !toReturn )
  116.       {
  117.         // Intentamos avanzar hacia la izquierda
  118.         auto nueva = Posicion(nuevaPosicion.fila,nuevaPosicion.columna-1);
  119.         toReturn = BuscarRuta(grafo,nueva,destino,ruta,pesoActual,pesoEsperado);
  120.       }
  121.     }
  122.  
  123.     if( !toReturn )
  124.     {
  125.       // Si no se ha encontrado una ruta válida se borra la posición
  126.       // que hemos registrado al inicio de la función
  127.       ruta.pop_back();
  128.       pesoActual -= nuevoPeso;
  129.     }
  130.   }
  131.  
  132.   return toReturn;
  133. }
  134.  
  135. int main()
  136. {
  137.   int valores[] = {6, 1, 9, 2, 4, 5,
  138.                    3, 7, 1, 5, 5, 9,
  139.                    5, 3, 4, 8, 7, 1,
  140.                    1, 3, 1, 4, 5, 3,
  141.                    3, 4, 8, 9, 2, 7};
  142.  
  143.   auto grafo = Grafo(5, 6, valores);
  144.  
  145.   auto posActual = Posicion(4,5);
  146.   auto posFinal = Posicion(4,0);
  147.   Ruta ruta;
  148.  
  149.   BuscarRuta(grafo,posActual,posFinal,ruta,0,48);
  150.  
  151.   if( ruta.empty() )
  152.     std::cout << "No se ha encontrado ninguna ruta" << std::endl;
  153.   else
  154.   {
  155.     std::cout << "Ruta encontrada:" << std::endl;
  156.     for( auto posicion : ruta )
  157.       std::cout << "(" << posicion.fila << "," << posicion.columna << ")" << std::endl;
  158.   }
  159.  
  160.   return EXIT_SUCCESS;
  161. }

PD.: el algoritmo encuentra una ruta alternativa a la que has encontrado tu :)
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.

Última edición por eferion; 13/01/2016 a las 04:57