コード例 #1
0
        private bool GenerujNowaLinie()
        {
            List <Stacja> petle = Model.GetPetle();

            // Losowanie pętli startowej.
            Line.Add(petle[Random.Next(petle.Count)]);
            int i = 0;

            while (i == 0 || !((Stacja)Line[i]).IsPetla)
            {
                // Losowanie stacji.
                List <Stacja> sasiednieElementy = ((Stacja)Line[i]).GetSasiednieStacje();
                Stacja        wylosowanaStacja  = sasiednieElementy[Random.Next(sasiednieElementy.Count)];
                int           loopGuard         = 0;
                while (Line.Contains(wylosowanaStacja))
                {
                    loopGuard++;
                    if (loopGuard > 5)
                    {
                        Line = new List <ElementModelu>();
                        return(false);
                    }

                    wylosowanaStacja = sasiednieElementy[Random.Next(sasiednieElementy.Count)];
                }

                Krawedz wylosowanaKrawedz = wylosowanaStacja.GetIncydentneKrawedzie()
                                            .Where(x => x.Stacja1.Id == Line[i].Id || x.Stacja2.Id == Line[i].Id).First();
                Line.Add(wylosowanaKrawedz);
                Line.Add(wylosowanaStacja);
                i = i + 2;
            }

            return(true);
        }
コード例 #2
0
        private List <BufforData> WyznaczKrawedzie(int idSPocz, BufforData bufInitData, List <int> st)
        {
            List <KrawedzSieci> krawedzie = bufInitData.Krawedzie;
            Stacja s = bufInitData.Sasiad;
            IEnumerable <Krawedz> inc = s.GetIncydentneKrawedzie()
                                        .Where(x => WykorzystaneKrawedzie.ContainsKey(x))
                                        .Where(x => krawedzie.Count() > 0 ? krawedzie[krawedzie.Count() - 1].Krawedz != x : true);

            List <BufforData> bufforData = new List <BufforData>();

            foreach (Krawedz k in inc)
            {
                List <KrawedzSieci> cloneKrawedzie = krawedzie.Select(item => item).ToList();
                KrawedzSieci        krawedz        = new KrawedzSieci(WykorzystaneKrawedzie[k], k);
                Stacja sasiad = s.Id == k.Stacja1.Id ? k.Stacja2 : k.Stacja1;
                if (st.Contains(sasiad.Id))
                {
                    int[] key = new int[2] {
                        idSPocz, sasiad.Id
                    };
                    cloneKrawedzie.Add(krawedz);
                    st.Remove(sasiad.Id);
                    Polaczenie p = new Polaczenie(key, cloneKrawedzie);
                    WyznaczonePolaczenia.Add(p);

                    BufforData buf;
                    buf.Krawedzie = cloneKrawedzie;
                    buf.Sasiad    = sasiad;
                    bufforData.Add(buf);
                }
            }

            return(bufforData);
        }
コード例 #3
0
ファイル: Krawedz.cs プロジェクト: maciex006/optymalizacja
 public Krawedz(int id, Stacja st1, Stacja st2, int koszt)
 {
     st1.AddKrawedz(this);
     st2.AddKrawedz(this);
     this.Id      = id;
     this.Stacja1 = st1;
     this.Stacja2 = st2;
     this.Koszt   = koszt;
 }
コード例 #4
0
ファイル: Stacja.cs プロジェクト: maciex006/optymalizacja
        /// <summary>
        ///     Metoda generująca losowo krawędzie oraz ruch na stacjach.
        /// </summary>
        /// <param name="t"> Liczba interwałów czasowych. </param>
        /// <param name="st"> Stacja aktualnie uzupelaniana danymi.</param>
        /// <param name="stacje"> List stacji w modelu. </param>
        /// <param name="r"> Random r. </param>
        /// <param name="krawedzie"> Lista krawédzi w modelu.</param>
        public void Generuj(int t, Stacja st, List <Stacja> stacje, List <Krawedz> krawedzie, Random r)
        {
            this.InterwalyT = t;
            this.Random     = r;
            int randomLiczbaKrawedzi = 0;

            if (IncydentneKrawedzie.Count < MAX_LICZ_KRAW)
            {
                randomLiczbaKrawedzi = LosujLiczbeKraw(IncydentneKrawedzie.Count);
            }

            for (int i = 0; i < randomLiczbaKrawedzi; i++)
            {
                int ranNum = r.Next(stacje.Count);
                while (IncydentneKrawedzie.Any(x => x.Stacja1.Id == ranNum || x.Stacja2.Id == ranNum) || st.Id == ranNum)
                {
                    ranNum = r.Next(stacje.Count);
                }

                // Tymczasowa generacja Id - zmienić później. Podobnie z losowaniem kosztu.
                Stacja s = stacje.First(x => x.Id == ranNum);
                if (s.GetIncydentneKrawedzie().Count() < MAX_LICZ_KRAW)
                {
                    krawedzie.Add(new Krawedz(i + 10 * ranNum, st, s, r.Next(5) + 2));
                }
            }

            foreach (Stacja s in stacje)
            {
                if (s.Id != this.Id)
                {
                    if (!Ruch.ContainsKey(s))
                    {
                        Ruch.Add(s, new MacierzRuchu(r, t));
                    }
                }
            }

            //foreach (Krawedz k in IncydentneKrawedzie)
            //{
            //    Stacja s = k.Stacja1.Id != Id ? k.Stacja1 : k.Stacja2;
            //    if (!Ruch.ContainsKey(s))
            //    {
            //        Ruch.Add(s, new MacierzRuchu(r, t));
            //    }
            //    if (!s.Ruch.ContainsKey(this))
            //    {
            //        s.Ruch.Add(this, new MacierzRuchu(r, t));
            //    }
            //}
        }