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 void WyznaczFunkcjeKosztu() { if (WyznaczonePolaczenia.Count() == 0) { WyznaczWykorzsytaneKrawedzie(); WyznaczPolaczenia(); } List <Stacja> stacje = Model.GetStacje(); foreach (Linia l in Linie) { l.Koszt = 0; } // Tymczasowe bool temp = true; // Tymczasowe foreach (Stacja s in stacje) { //.Where(x => !x.Value.CheckIfNull()).ToDictionary(x => x.Key, x => x.Value) Dictionary <Stacja, MacierzRuchu> ruch = s.GetRuch(); foreach (Stacja cel in stacje) { if (s.Id != cel.Id) { MacierzRuchu r = ruch[cel]; if (!(r.CheckIfNull())) { int[] key = (s.Id < cel.Id ? new int[2] { s.Id, cel.Id } : new int[2] { cel.Id, s.Id }); if (WyznaczonePolaczenia.Any(x => x.Id[0] == key[0] && x.Id[1] == key[1])) { // Tymczasowe if (temp) { WykorzystanePrzystanki++; } // Tymczasowe Polaczenie p = WyznaczonePolaczenia.First(x => x.Id[0] == key[0] && x.Id[1] == key[1]); //Implementacja dla t = 1! double liczbaPasazerow = r.GetLiczbaPasazerow(); foreach (KrawedzSieci k in p.Krawedzie) { liczbaPasazerow = liczbaPasazerow / k.IdLinii.Count(); double x = (liczbaPasazerow / k.Krawedz.GetKoszt() - 1); foreach (int i in k.IdLinii) { Linie[i].Koszt = Linie[i].Koszt + x; } } } } } } // Tymczasowe temp = false; // Tymczasowe } stacje.ForEach((item) => { NiewykorzystaneStacje.Add(item); }); foreach (Krawedz k in WykorzystaneKrawedzie.Keys) { if (NiewykorzystaneStacje.Contains(k.Stacja1)) { NiewykorzystaneStacje.Remove(k.Stacja1); } if (NiewykorzystaneStacje.Contains(k.Stacja2)) { NiewykorzystaneStacje.Remove(k.Stacja2); } } Koszt = Linie.Sum(x => x.Koszt) / LiczbaLinii; foreach (Stacja s in NiewykorzystaneStacje) { int penalty = s.GetRuch().Values.Sum(x => x.GetSumaRuchu()); Koszt = Koszt - (s.IsPetla ? penalty * 100 : penalty); } }