コード例 #1
0
        /// <summary>
        /// Vytváří novou hranu, dle zadání uživatele a přidává ji do grafu.
        /// </summary>
        /// <param name="klicPocatecnihoVrcholu">Klíč počátečního vrcholu</param>
        /// <param name="klicKonecnehoVrcholu">Klíč konečného vrcholu</param>
        /// <param name="delkaHrany">Délka hrany</param>
        /// <returns>Novou hranu.</returns>
        public DataHran VytvorHranu(string klicPocatecnihoVrcholu, string klicKonecnehoVrcholu, short delkaHrany)
        {
            DataHran novaHrana = new DataHran(); //vytvorime novou instanci hrany

            novaHrana.PocatekHrany = klicPocatecnihoVrcholu;
            novaHrana.KonecHrany   = klicKonecnehoVrcholu;
            novaHrana.DelkaHrany   = delkaHrany;
            ag.PridejHranu(klicPocatecnihoVrcholu, klicKonecnehoVrcholu, novaHrana);
            return(novaHrana);
        }
コード例 #2
0
        /// <summary>
        /// Rekurzivní prohledávání haldy (procházení grafu/lesa apod). Cílem je nalezení nejratší cesty v daném grafu.
        /// </summary>
        //rekurzivni prohledani haldy aby to spojilo cesty s naslednyma,
        //aby to prochazelo prioritni frontu dokad je co prochazet
        public void ProjdiGraf()

        {
            Cesta dosavadniProjitaCesta = prioritniFronta.OdeberPrvek();

            if (dosavadniProjitaCesta == null)
            {
                return;
            }

            //v hranate zavorce je x-ty prvek listu - tady je to ten posledni, posledni projita cesta, tady h
            DataHran h = dosavadniProjitaCesta.NavstiveneHrany.Count == 0 ? null : dosavadniProjitaCesta.NavstiveneHrany[dosavadniProjitaCesta.NavstiveneHrany.Count - 1];

            foreach (DataHran obecnaHrana in ag.VratIncidentniHrany(dosavadniProjitaCesta.AktualniVrchol))
            {
                // preskoci cestu po ktere jsme prisli
                if (obecnaHrana == h)
                {
                    continue;
                }

                // TODO: pokud bude potreba, mohou se vynechat cesty polomu viz kod nize.
                // Je potreba dodat tlacitka pripadne
                // if (obecnaHrana.JeFunkcniCesta == false)
                // {
                //     continue;
                // }

                // Informace je nositel informace, ktera je prioritizovana, tady treba cesta
                // hledam, ktery vrchol se pouzije jako naslednik
                if (dosavadniProjitaCesta.AktualniVrchol == obecnaHrana.PocatekHrany)
                {
                    VlozCestuDoFronty(
                        obecnaHrana.KonecHrany,
                        obecnaHrana,
                        dosavadniProjitaCesta.CenaCeleCesty + obecnaHrana.DelkaHrany,
                        dosavadniProjitaCesta);
                }
                else if (dosavadniProjitaCesta.AktualniVrchol == obecnaHrana.KonecHrany)
                {
                    VlozCestuDoFronty(
                        obecnaHrana.PocatekHrany,
                        obecnaHrana,
                        dosavadniProjitaCesta.CenaCeleCesty + obecnaHrana.DelkaHrany,
                        dosavadniProjitaCesta);
                }
            }

            //pridam do listu vyresenych vrcholu
            VrcholyUzVyresene.Add(dosavadniProjitaCesta.AktualniVrchol);
            ProjdiGraf();
        }
コード例 #3
0
        /// <summary>
        /// Vkládá nově vygenerovanou cestu do prioritní fronty.
        /// </summary>
        /// <param name="novyVrchol">Koncový vrchol nové cesty.</param>
        /// <param name="novyUsek">Přidávaná hrana do cesty.</param>
        /// <param name="cena">Ohodnocení cesty.</param>
        /// <param name="dosavadniCesta">Původní cesta bez přidávané hrany.</param>
        private void VlozCestuDoFronty(string novyVrchol, DataHran novyUsek, float cena, Cesta dosavadniCesta = null)
        {
            // jestli objekt vubec existuje a cena doposud nalezene cesty je mensi nez vkladana tak se nic nemeni
            if (NejkratsiNalezenaCesta != null && NejkratsiNalezenaCesta.CenaCeleCesty <= cena)
            {
                return;
            }

            if (VrcholyUzVyresene.Contains(novyVrchol))
            {
                return;
            }
            else
            {
                Cesta cestaSNovymUsekem = new Cesta();
                if (dosavadniCesta != null)
                {
                    foreach (DataHran dosavadniHrana in dosavadniCesta.NavstiveneHrany)
                    {
                        cestaSNovymUsekem.NavstiveneHrany.Add(dosavadniHrana);
                    }
                }
                cestaSNovymUsekem.NavstiveneHrany.Add(novyUsek);
                cestaSNovymUsekem.AktualniVrchol = novyVrchol;
                cestaSNovymUsekem.CenaCeleCesty  = cena;


                // pokud nahrazovana cesta konci v hledané zastávce nastavime jako nejkratsi cestu
                if (cestaSNovymUsekem.AktualniVrchol == klicKonce)
                {
                    NejkratsiNalezenaCesta = cestaSNovymUsekem;
                }

                foreach (Cesta cestaZGertrudy in prioritniFronta.vratPrvky())
                {
                    //v prioritni fronte hledam cestu, ktera konci v aktualnim vrcholu
                    //jestlize ma aktualne nalezena cesta mensi cenu, nahradi dosavadni
                    if (cestaZGertrudy.AktualniVrchol.Equals(novyVrchol) && cena < cestaZGertrudy.CenaCeleCesty)
                    {
                        bool nahrazeno = prioritniFronta.NahradPrvek(cestaZGertrudy, cestaSNovymUsekem, (int)cestaSNovymUsekem.CenaCeleCesty);
                        if (nahrazeno)
                        {
                            return;
                        }
                    }
                }
                prioritniFronta.VlozPrvek(cestaSNovymUsekem, (int)cena);
            }
        }
コード例 #4
0
        /// <summary>
        /// Načítání hran/cest ze souboru csv.
        /// </summary>
        public void NactiHranyZCSV()
        {
            List <string[]> objekt = editorCSV.NactiSoubor(cestaKsouboruCesty50);
            //ukladani poradi radku do int, aby se pak dala vynechat hlavicka souboru Cesty
            int poradiRadku = 0;

            foreach (string[] radek in objekt)
            {
                poradiRadku++;
                if (poradiRadku == 1)
                {
                    continue;
                }
                DataHran novaHrana = new DataHran(); //vytvorime novou instanci hrany
                novaHrana.PocatekHrany = radek[0];
                novaHrana.KonecHrany   = radek[1];
                novaHrana.DelkaHrany   = short.Parse(radek[2]);
                ag.PridejHranu(radek[0], radek[1], novaHrana);
            }
        }