public void Run() { int COUNTER_INIT_VALUE = 1500; InitPopulacja(); Populacja = Populacja.OrderByDescending(x => x.Koszt).ToList(); int counter = COUNTER_INIT_VALUE; Siec najlepsza = Populacja[0]; double maxValue = Populacja[0].Koszt; while (counter > 0) { if (maxValue < Populacja[0].Koszt) { counter = COUNTER_INIT_VALUE; maxValue = Populacja[0].Koszt; najlepsza = Populacja[0]; } else { counter--; } Sequence(); Populacja = Populacja.OrderByDescending(x => x.Koszt).ToList(); } Console.WriteLine("Najlepsza siec: \n" + najlepsza + ", koszt = " + najlepsza.Koszt); }
private List <Siec> Krzyzowanie(List <Siec> populacja) { List <Siec> nowaPopulacja = new List <Siec>(); int i = 0; foreach (Siec s in populacja) { List <Siec> pula = populacja.Where(x => x.Id != s.Id).ToList(); if (pula.Count() == 0) { return(null); } int ran = Random.Next(pula.Count() - 1); Siec newS = pula[ran] + s; newS.Id = i++; nowaPopulacja.Add(newS); } return(nowaPopulacja); }
// Operator krzyżowania public static Siec operator +(Siec s1, Siec s2) { if (s1.LiczbaLinii == s2.LiczbaLinii) { int przeciecie = s1.LosujPrzeciecie(); //int przeciecie = (int)(s1.Koszt > s2.Koszt ? (s1.Koszt / s2.Koszt) : (s2.Koszt / s1.Koszt))* (s1.Linie.Count()); Siec s = new Siec(0, s1.Model, s1.Random, s1.LiczbaLinii, generuj: false); //Porownaj List <int> l1 = s1.Linie.Select(x => x.GetUniqueCode()).ToList(); List <int> l2 = s2.Linie.Select(x => x.GetUniqueCode()).ToList(); double stP = (double)l1.Intersect(l2).Count() / (double)s1.Linie.Count() * 1000; int stPokrewienstwa = (int)stP; //Console.WriteLine(stPokrewienstwa); s.Linie = new List <Linia>(); //s.Linie.AddRange(s1.Linie.OrderByDescending(x => x.Koszt).Take(przeciecie)); //s.Linie.AddRange(s2.Linie.OrderByDescending(x => x.Koszt).Skip(przeciecie).Take(s2.Linie.Count() - przeciecie)); s.Linie.AddRange(s1.Linie.Take(przeciecie)); s.Linie.AddRange(s2.Linie.Skip(przeciecie).Take(s2.Linie.Count() - przeciecie)); //Im bardziej podobne tym większe prawdopodobieństwo mutacji. if (s.NextWithProbability(stPokrewienstwa)) { s.Mutuj(); } s.WyznaczWykorzsytaneKrawedzie(); s.WyznaczPolaczenia(); s.WyznaczFunkcjeKosztu(); return(s); } else { return(null); } }
static void Main(string[] args) { string filePath = "D:\\konfig.txt"; // ścieżka do pliku z modelem. int n = 35; // liczba przystanków int t = 1; // liczba interwalów czasowych. int p = 10; // liczba petli. int l = 2; // liczba linii. Random r = new Random(); Model m = new Model(r); m.Generuj(n, t, p); string command = ""; while (command != "exit") { command = Console.ReadLine(); int[] param; string txtCommand; if (GetCommand(command, out txtCommand, out param)) { switch (txtCommand) { case "load": if (param == null || param.Count() == 0) { m = new Model(r); if (m.Wczytaj(filePath)) { Console.WriteLine("Wczytano model z pliku."); } else { Console.WriteLine("Błędna składnia pliku. Nie udało się wczytać."); } } else { Console.WriteLine("Błąd skladni"); } break; case "inc": if (param != null && param.Count() == 1) { WriteIncydentneKrawedzie(m, param[0]); } else { Console.WriteLine("Błąd skladni"); } break; case "neig": if (param != null && param.Count() == 1) { WriteSasiedzi(m, param[0]); } else { Console.WriteLine("Błąd skladni"); } break; case "term": if (param == null || param.Count() == 0) { WritePetle(m); } else { Console.WriteLine("Błąd skladni"); } break; case "traf": if (param != null && param.Count() == 1) { WriteRuch(m, param[0]); } else { Console.WriteLine("Błąd skladni"); } break; case "newline": if (param == null || param.Count() == 0) { Linia T = LosujLinie(m, r); WriteLinia(T); } else { Console.WriteLine("Błąd skladni"); } break; case "cntk": if (param != null && param.Count() == 1) { Console.WriteLine("Liczba stacji o krawędziach " + param[0] + " = " + m.CountStacje(param[0]).ToString() + "\n"); } else { Console.WriteLine("Błąd skladni"); } break; case "cntp": if (param != null && param.Count() == 1) { Console.WriteLine("Liczba pętli o krawędziach " + param[0] + " = " + m.CountPetle(param[0]).ToString() + "\n"); } else { Console.WriteLine("Błąd skladni"); } break; case "newweb": if (param == null || param.Count() == 0) { Siec s = new Siec(1, m, r, l); Console.WriteLine(s); // Wyk kraw. Dictionary <Krawedz, List <int> > wyk = s.GetWykorzystaneKrawedzie(); Console.WriteLine(); Console.WriteLine(string.Join("\n", wyk.Select(x => x.Key.ToString() + "=" + "{" + string.Join(",", x.Value) + "}").ToArray())); List <Polaczenie> pol = s.GetWyznaczonePolaczenia(); Console.WriteLine(); Console.WriteLine(string.Join("\n", pol.Select(x => "[" + x.Id[0] + "," + x.Id[1] + "] = " + "{" + string.Join(",", x.Krawedzie.Select(y => y.Krawedz.StringFormatDlaPolaczen)) + "}").ToArray())); Console.WriteLine(); Console.WriteLine(s.PrintKoszt()); Console.WriteLine(); Console.WriteLine("Wykorzystane przystanki: " + s.WykorzystanePrzystanki + "/" + m.GetStacje().Count() + "\n"); } else { Console.WriteLine("Błąd skladni"); } break; case "run": if (param == null || param.Count() == 0) { AlgorytmEwolucyjny alg = new AlgorytmEwolucyjny(m, r, l, 10); alg.Run(); } else { Console.WriteLine("Błąd skladni"); } break; case "exit": Console.WriteLine("Wychodzę"); break; default: Console.WriteLine("Nieznana komenda"); break; } } else { Console.WriteLine("Błąd skladni"); } } }