Ejemplo n.º 1
0
        void inicializaVD(Vertice v_inicial)
        {
            //Para cada vertice del grafo, creo de el un elemento de dijkstra
            foreach (Vertice v in listaVertices)
            {
                elementoDij e_di = new elementoDij(v, null, double.MaxValue, false, v.getId());                 //< Vertice, peso, definitivo, id
                elementoDList.Add(e_di);
            }

            // e_inicial{v_inicial, 0, noDefinitivo}
            // Busco el vertice que coincide con el inicial y hago lo de arriba
            elementoDij e_d;

            for (int i = 0; i < elementoDList.Count; i++)
            {
                e_d = elementoDList[i];
                e_d.setVertice(elementoDList[i].getVEDJ());
                if (e_d.getVEDJ() == v_inicial)
                {
                    elementoDij nuevo = new elementoDij(v_inicial, v_inicial, 0, false, v_inicial.getId());
                    //e_d = nuevo;
                    elementoDList[i] = nuevo;
                    break;
                }
            }
        }
Ejemplo n.º 2
0
        /////////// ALGORITMO ///////////

        void DijkstraA(Vertice v_inicial, Vertice destino)
        {
            elementoDij e_d = new elementoDij(null, null, double.MaxValue, false, 0);             //< Dummy

            inicializaVD(v_inicial);

            /*while(!solucion(destino)){
             *      e_d = seleccionaDefinitivo();
             *      actualiza(e_d);
             * }*/

            while (!solucion())
            {
                e_d = seleccionaDefinitivo();
                actualiza(e_d);
            }
        }
Ejemplo n.º 3
0
        void actualiza(elementoDij e_d)
        {
            int posED = 0;

            foreach (Arista a_i in e_d.getVEDJ().getLA())             //< Consigo los adyacentes del elementoDIJK mediante la lista de aristas
            // Si el el destino de la arista da con el elemento, asigno el elemento al nuevo elemento

            {
                posED = buscaElemento(a_i.getDestino().getId());        //< Posicion de mi elemento a actualizar
                elementoDij e_i = elementoDList[posED];                 //< lo asigno a un temporal

                //Si el peso de ti temporal es mayor al nuevo peso lo cambio y lo agrego de nuevo a la lista en la posicion
                if (e_i.getPeso() > (e_d.getPeso() + a_i.getDistancia()))
                {
                    e_i.setPeso((e_d.getPeso() + a_i.getDistancia()));
                    e_i.setVerticeProv(e_d.getVEDJ());
                    elementoDList[posED] = e_i;
                }
            }
        }
Ejemplo n.º 4
0
        elementoDij seleccionaDefinitivo()
        {
            //Devuelve el vertice del elemento Dijkstra que tenga el peso menor y que no sea definitivo, lo hace definitivo

            double      min     = double.MaxValue;
            elementoDij posible = new elementoDij(null, null, double.MaxValue, false, 100);             //< Elemento dummy
            elementoDij e_d;

            for (int i = 0; i < elementoDList.Count; i++)
            {
                e_d = elementoDList[i];

                if (!e_d.esDefininito())
                {
                    if (e_d.getPeso() < min)
                    {
                        min     = e_d.getPeso();               //< Actualizo el peso minimo
                        posible = e_d;                         //< Lo asigno a mi candidato
                    }
                }
            }
            posible.setDefinitivo(true);
            return(posible);            //< Le asigno definitivo y lo regreso
        }