Пример #1
0
 public ListD <Vertex <T> > MiniDijkstraWay(string pNombreVerticeA, string pNombreVerticeB)
 {
     if (pNombreVerticeA != pNombreVerticeB && !IsGuide)
     {
         if (this.NegativeWeightatEdge())
         {
             throw new Exception("Existe algun valor negativo en el peso de los arcos");
         }
         HashTable <String, int> costosFinales    = GetHashTableByDijkstra();
         HashTable <String, int> costosTemporales = GetHashTableByDijkstra();
         string clave = null;
         this.CleanVerticeVisit();
         ListD <Vertex <T> > ListaAuxiliarDSucesores, ListaSucesores = this.GetListaSuccessors(pNombreVerticeA);
         Vertex <T>          verticeActual = this.GetVertexByName(pNombreVerticeA);
         verticeActual.IsVisit = true;
         Edge <T> arco = null;
         int      peso = 0, costo = 0;
         Iterator <Vertex <T> > iterador = new Iterator <Vertex <T> >(ListaSucesores.GetCabeza());
         bool noSalir = true;
         costosTemporales.ActualizarDatoPorClave(pNombreVerticeA, 0);
         costosFinales.ActualizarDatoPorClave(pNombreVerticeA, 0);
         while (noSalir)
         {
             for (Vertex <T> verticeAdyac = iterador.Next(); verticeAdyac != null; verticeAdyac = iterador.Next())
             {
                 arco = GetEdge(verticeActual.Name, verticeAdyac.Name);
                 if (arco != null)
                 {
                     costo = (int)arco.GetWeight() + peso;
                     if (costosTemporales.SearchByKey(arco.GetVertB().Name) > costo || costosTemporales.SearchByKey(arco.GetVertB().Name) == -1)
                     {
                         costosTemporales.ActualizarDatoPorClave(arco.GetVertB().Name, costo);
                     }
                 }
             }
             int index = -1, auxiliar = 0;
             clave = null;
             for (int i = 0; i < costosTemporales.GetSize(); i++)
             {
                 clave = costosTemporales.GetClave(i);
                 if ((auxiliar == 0 || auxiliar > costosTemporales.GetForIndex(i)) && (costosTemporales.GetForIndex(i) >= 0 && clave != null))
                 {
                     if (!VerticesGroup.SearchByKey(clave).IsVisit)
                     {
                         auxiliar = costosTemporales.GetForIndex(i);
                         index    = i;
                     }
                 }
             }
             if (index != -1)
             {
                 clave = costosTemporales.GetClave(index);
                 costosFinales.UpdateByIndex(index, auxiliar);
                 verticeActual         = VerticesGroup.SearchByKey(clave);
                 verticeActual.IsVisit = true;
             }
             else
             {
                 if (StopAnalisis())
                 {
                     noSalir = false;
                 }
             }
             ListaAuxiliarDSucesores = this.GetListSuccessorNotVisited(clave);
             if (ListaAuxiliarDSucesores.GetCabeza() != null)
             {
                 ListaSucesores = ListaAuxiliarDSucesores;
             }
             peso     = auxiliar;
             index    = -1;
             auxiliar = 0;
             iterador = new Iterator <Vertex <T> >(ListaSucesores.GetCabeza());
         }
         ListD <Vertex <T> > ListaCaminoCorto = GetCaminoMinimo(costosFinales, pNombreVerticeB);
         return(ListaCaminoCorto);
     }
     return(null);
 }
Пример #2
0
 public Lista <Vertice <T> > RutaMinimaDijkstra(string pNombreVerticeA, string pNombreVerticeB)
 {
     if (pNombreVerticeA != pNombreVerticeB && !EsDirigido)
     {
         if (this.HayPesosNegativosEnArcos())
         {
             throw new Exception("Existe algun valor negativo en el peso de los arcos");
         }
         TablaHash <String, int> costosFinales    = GetTablasHashParaDijkstra();
         TablaHash <String, int> costosTemporales = GetTablasHashParaDijkstra();
         string clave = null;
         this.LimpiaVisitasVertices();
         Lista <Vertice <T> > ListaAuxiliarDSucesores, ListaSucesores = this.GetListaSucesores(pNombreVerticeA);
         Vertice <T>          verticeActual = this.GetVerticePorNombre(pNombreVerticeA);
         verticeActual.EsVisit = true;
         Arista <T> arco = null;
         int        peso = 0, costo = 0;
         Iterador <Vertice <T> > iterador = new Iterador <Vertice <T> >(ListaSucesores.GetCabeza());
         bool noSalir = true;
         costosTemporales.ActualizarDatoPorClave(pNombreVerticeA, 0);
         costosFinales.ActualizarDatoPorClave(pNombreVerticeA, 0);
         while (noSalir)
         {
             for (Vertice <T> verticeAdyac = iterador.Next(); verticeAdyac != null; verticeAdyac = iterador.Next())
             {
                 arco = GetArco(verticeActual.Nombre, verticeAdyac.Nombre);
                 if (arco != null)
                 {
                     costo = (int)arco.GetPeso() + peso;
                     if (costosTemporales.BuscaHashPorClave(arco.GetVertB().Nombre) > costo || costosTemporales.BuscaHashPorClave(arco.GetVertB().Nombre) == -1)
                     {
                         costosTemporales.ActualizarDatoPorClave(arco.GetVertB().Nombre, costo);
                     }
                 }
             }
             int index = -1, auxiliar = 0;
             clave = null;
             for (int i = 0; i < costosTemporales.GetTamanio(); i++)
             {
                 clave = costosTemporales.GetClave(i);
                 if ((auxiliar == 0 || auxiliar > costosTemporales.GetForIndex(i)) && (costosTemporales.GetForIndex(i) >= 0 && clave != null))
                 {
                     if (!ArregloDVertices.BuscaHashPorClave(clave).EsVisit)
                     {
                         auxiliar = costosTemporales.GetForIndex(i);
                         index    = i;
                     }
                 }
             }
             if (index != -1)
             {
                 clave = costosTemporales.GetClave(index);
                 costosFinales.ActualizarDatoPorIndex(index, auxiliar);
                 verticeActual         = ArregloDVertices.BuscaHashPorClave(clave);
                 verticeActual.EsVisit = true;
             }
             else
             {
                 if (DetenerAnalisis())
                 {
                     noSalir = false;
                 }
             }
             ListaAuxiliarDSucesores = this.GetListaSucesoresNoVisitados(clave);
             if (ListaAuxiliarDSucesores.GetCabeza() != null)
             {
                 ListaSucesores = ListaAuxiliarDSucesores;
             }
             peso     = auxiliar;
             index    = -1;
             auxiliar = 0;
             iterador = new Iterador <Vertice <T> >(ListaSucesores.GetCabeza());
         }
         Lista <Vertice <T> > ListaCaminoCorto = GetCaminoMinimo(costosFinales, pNombreVerticeB);
         return(ListaCaminoCorto);
     }
     return(null);
 }