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); }
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); }
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; }
/// <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)); // } //} }