private static List <Osobnik> KrzyżujOX(List <Osobnik> rodzice) { Osobnik o1 = new Osobnik(); Osobnik o2 = new Osobnik(); for (int i = 0; i < rodzice.Count - 1; i++) { Osobnik o = KrzyżujParęOX(i, rodzice); if (i % 2 == 0) { o1 = o; } else { o2 = o; rodzice[i - 1] = o1; rodzice[i] = o2; o1 = new Osobnik(); o2 = new Osobnik(); } } return(rodzice); }
static void Main(string[] args) { TSP.Instancja.PrepareVariables(); List <Osobnik> osobnicy = new List <Osobnik>(); Osobnik najlepszy = new Osobnik(); WygenerujPopulacjęPoczątkową(ref osobnicy); najlepszy.ocena = int.MaxValue; najlepszy = TSP.Instancja.ZnajdźMinimum(osobnicy, najlepszy); Console.WriteLine("Minimum w populacji początkowej wynosi: " + najlepszy.ocena); long t1 = DateTime.Now.Ticks; while (TSP.Instancja.DocelowaLiczbaIteracji > TSP.Instancja.licznikGłówny) { TSP.Instancja.WykonajIterację(ref osobnicy, ref najlepszy); } TimeSpan tz = new TimeSpan(DateTime.Now.Ticks - t1); TSP.Instancja.Podsumuj(tz, najlepszy); Console.ReadKey(); }
static Osobnik[] StwórzPopulacjęZPliku(string ścieżka) { int licznik = 0; string linijka; System.IO.StreamReader plik = new System.IO.StreamReader(@ścieżka); Osobnik osobnik = new Osobnik(); Osobnik.listaMiast = new List <Miasto>(); while ((linijka = plik.ReadLine()) != "EOF") { if (licznik >= 7) { string[] słowa = linijka.Split(' '); var indeks = int.Parse(słowa[0]) - 1; Osobnik.listaMiast.Add(new Miasto(indeks, double.Parse(słowa[1], CultureInfo.InvariantCulture), double.Parse(słowa[2], CultureInfo.InvariantCulture))); osobnik.genotyp.Add(indeks); } licznik++; } plik.Close(); Osobnik[] populacja = new Osobnik[wielkośćPopulacji]; for (int i = 0; i < wielkośćPopulacji; i++) { populacja[i] = osobnik.WymieszajOsobnika(); } niebo = populacja[0]; return(populacja); }
static Osobnik SelekcjaTurniejowa(Osobnik[] populacja) { Osobnik osobnik1 = populacja[Program.random.Next(Program.wielkośćPopulacji)]; Osobnik osobnik2 = populacja[Program.random.Next(Program.wielkośćPopulacji)]; return(Osobnik.PorównajOsobników(osobnik1, osobnik2)); }
private static Osobnik KrzyżujParęOX(int indeksRodziców, List <Osobnik> rodzice) { Osobnik o = new Osobnik(); int indeksKrzyżowania = 0; indeksKrzyżowania = RNG.Next(Osobnik.liczbaMiast / 2); for (int j = indeksKrzyżowania; j < indeksKrzyżowania + Osobnik.liczbaMiast / 2; j++) { o.trasa[j] = rodzice[indeksRodziców].trasa[j]; } for (int j = indeksKrzyżowania; j < indeksKrzyżowania + Osobnik.liczbaMiast / 2; j++) { if (Array.IndexOf(o.trasa, rodzice[indeksRodziców + 1].trasa[j]) == -1) { int indeksPrzepisanejWartości = Array.IndexOf(rodzice[indeksRodziców + 1].trasa, o.trasa[j]); while (o.trasa[indeksPrzepisanejWartości] != 0) { indeksPrzepisanejWartości = Array.IndexOf(rodzice[indeksRodziców + 1].trasa, o.trasa[indeksPrzepisanejWartości]); } o.trasa[indeksPrzepisanejWartości] = rodzice[indeksRodziców + 1].trasa[j]; } } for (int j = 0; j < Osobnik.liczbaMiast; j++) { if (Array.IndexOf(o.trasa, rodzice[indeksRodziców + 1].trasa[j]) == -1) { o.trasa[Array.IndexOf(o.trasa, 0)] = rodzice[indeksRodziców + 1].trasa[j]; } } return(o); }
public Osobnik WymieszajOsobnika() { Osobnik nowyOsobnik = new Osobnik(); nowyOsobnik.genotyp = new List <int>(genotyp).OrderBy(x => Program.random.Next()).ToList(); return(nowyOsobnik); }
private static void WyświetlNajlepszego(Osobnik najlepszy) { foreach (int i in najlepszy.trasa) { Console.Write(najlepszy.trasa[i] + " "); } Console.WriteLine(); }
public void Podsumuj(TimeSpan tz, Osobnik najlepszy) { Console.WriteLine("Czas wykonania w sekundach: " + tz.Seconds); Console.WriteLine("Liczba iteracji: " + TSP.Instancja.licznikGłówny); Console.WriteLine("Minimmalna ocena wynosi: " + najlepszy.ocena); ZwróćPoprawnąTrasę(najlepszy); }
private void ZwróćPoprawnąTrasę(Osobnik najlepszy) { if (TSP.SprawdźPoprawnośćTrasy(najlepszy)) { Console.WriteLine("Najlepsza znaleziona poprawna trasa: "); TSP.WyświetlNajlepszego(najlepszy); } else { Console.WriteLine("Znaleziona trasa nie jest poprawna."); } }
public Osobnik ZnajdźMinimum(List <Osobnik> osobnicy, Osobnik najlepszy) { for (int i = 0; i < osobnicy.Count - 1; i++) { if (najlepszy.ocena > osobnicy[i].ocena) { najlepszy = osobnicy[i]; } } return(najlepszy); }
public static Osobnik Oblicz(Osobnik trasa) { int czasObliczeń = 1000 * 60 * 30; //30 minut Stopwatch stoper = new Stopwatch(); stoper.Start(); while (stoper.ElapsedMilliseconds <= czasObliczeń) { Osobnik sąsiad = new Osobnik(); sąsiad.genotyp = trasa.genotyp.GetRange(0, trasa.genotyp.Count); int punkt1 = Program.random.Next(trasa.genotyp.Count); int punkt2 = Program.random.Next(trasa.genotyp.Count); int temp; temp = sąsiad.genotyp[punkt1]; sąsiad.genotyp[punkt1] = sąsiad.genotyp[punkt2]; sąsiad.genotyp[punkt2] = temp; if (sąsiad.SzybkośćTrasy() != 0 && sąsiad.SzybkośćTrasy() < trasa.SzybkośćTrasy()) { trasa = sąsiad; //Console.WriteLine(trasa.SzybkośćTrasy()); } } stoper.Stop(); Console.WriteLine("Znaleziona ścieżka: "); for (int i = 0; i < trasa.genotyp.Count; i++) { Console.Write(Osobnik.listaMiast[trasa.genotyp[i]].indeks + " "); } Console.WriteLine("\nSzybkość trasy: " + trasa.SzybkośćTrasy()); Console.WriteLine("\nLiczba baterii: " + trasa.liczbaBateriiOsobnika); using (System.IO.StreamWriter zapisator = new System.IO.StreamWriter(@"../../Wyniki/Z" + Program.nazwaPlikuWejściowego + "-" + Program.liczbaBaterii + "-" + DateTime.Now.ToString().Replace(':', '-') + ".txt")) { zapisator.WriteLine("\nSzybkość trasy: " + trasa.SzybkośćTrasy()); zapisator.WriteLine("\nLiczba baterii: " + trasa.liczbaBateriiOsobnika); zapisator.WriteLine(); for (int i = 0; i < trasa.genotyp.Count; i++) { zapisator.Write(Osobnik.listaMiast[trasa.genotyp[i]].indeks + " "); } zapisator.WriteLine(); } return(trasa); }
public static void Oblicz(Osobnik[] populacja, string nazwaPlikuWejściowego, int wielkośćPopulacji, int liczbaPokoleń, string krzyżowanie, int liczbaBaterii, string selekcja, double prawdopodobieństwoMutacji) { for (int i = 0; i < liczbaPokoleń; i++) { Osobnik[] nowaPopulacja = new Osobnik[wielkośćPopulacji]; for (int j = 0; j < wielkośćPopulacji; j++) { Osobnik tata = Selekcja.Selekcjonuj(Program.selekcja, populacja); Osobnik mama = Selekcja.Selekcjonuj(Program.selekcja, populacja); Osobnik dziecko = Krzyżowanie.Krzyżuj(krzyżowanie, tata, mama); //konkurencja między rodzicami i dzieckiem if (tata.SzybkośćTrasy() < mama.SzybkośćTrasy()) { nowaPopulacja[j] = tata; } else { nowaPopulacja[j] = mama; } if (dziecko.SzybkośćTrasy() < nowaPopulacja[j].SzybkośćTrasy()) { nowaPopulacja[j] = dziecko; } } populacja = nowaPopulacja; } Console.WriteLine("Znaleziona ścieżka: "); for (int i = 0; i < Program.niebo.genotyp.Count; i++) { Console.Write(Osobnik.listaMiast[Program.niebo.genotyp[i]].indeks + " "); } Console.WriteLine("\nSzybkość trasy: " + Program.niebo.SzybkośćTrasy()); Console.WriteLine("\nLiczba baterii: " + Program.niebo.liczbaBateriiOsobnika); using (System.IO.StreamWriter zapisator = new System.IO.StreamWriter(@"../../Wyniki/" + nazwaPlikuWejściowego + "-" + wielkośćPopulacji + "-" + liczbaPokoleń + "-" + krzyżowanie + "-" + liczbaBaterii + "-" + prawdopodobieństwoMutacji + "-" + selekcja + "-" + DateTime.Now.ToString().Replace(':', '-') + ".txt")) { zapisator.WriteLine("\nSzybkość trasy: " + Program.niebo.SzybkośćTrasy()); zapisator.WriteLine("\nLiczba baterii: " + Program.niebo.liczbaBateriiOsobnika); zapisator.WriteLine(); for (int i = 0; i < Program.niebo.genotyp.Count; i++) { zapisator.Write(Osobnik.listaMiast[Program.niebo.genotyp[i]].indeks + " "); } zapisator.WriteLine(); } }
static SortedList <int, int> ZmianaReprezentacjiNaSąsiedztwa(Osobnik osobnik) { SortedList <int, int> listaSąsiedztwa = new SortedList <int, int>(); for (int i = 0; i < osobnik.genotyp.Count - 1; i++) { listaSąsiedztwa.Add(osobnik.genotyp[i], osobnik.genotyp[i + 1]); } listaSąsiedztwa.Add(osobnik.genotyp[osobnik.genotyp.Count - 1], osobnik.genotyp[0]); return(listaSąsiedztwa); }
private static bool SprawdźPoprawnośćTrasy(Osobnik najlepszy) { bool result = true; for (int i = 0; i < najlepszy.trasa.Length; i++) { if (!najlepszy.trasa.Contains(i)) { result = false; } } return(result); }
public static Osobnik Krzyżuj(string typ, Osobnik tata, Osobnik mama) { if (typ == "OX") { return(KrzyżowanieOX(tata, mama)); } else if (typ == "przezWymianePodtras") { return(KrzyżowaniePrzezWymianęPodtras(tata, mama)); } else { Console.WriteLine("Podano błędny typ krzyżowania."); return(null); } }
static Osobnik ZmianaReprezentacjiNaŚcieżkową(SortedList <int, int> listaSąsiedztwa) { Osobnik osobnik = new Osobnik(); int indeks = 0; int element = 0; osobnik.genotyp.Add(listaSąsiedztwa.Keys[indeks]); for (int i = 0; i < listaSąsiedztwa.Count; i++) { element = listaSąsiedztwa.Values[indeks]; osobnik.genotyp.Add(element); indeks = listaSąsiedztwa.IndexOfKey(element); } osobnik.genotyp.RemoveAt(osobnik.genotyp.Count - 1); return(osobnik); }
public void WykonajIterację(ref List <Osobnik> osobnicy, ref Osobnik najlepszy) { List <Osobnik> rodzice = new List <Osobnik>(); rodzice = TSP.WybierzTurniej(osobnicy, TSP.Instancja.distances, TSP.Instancja.uczestnicyTurnieju); rodzice = TSP.KrzyżujOX(rodzice); rodzice = TSP.Mutuj(rodzice, Osobnik.liczbaMiast, TSP.Instancja.parametrMutacji); foreach (Osobnik o in rodzice) { o.OceńOsobnika(TSP.Instancja.distances); } najlepszy = new Osobnik(TSP.Instancja.ZnajdźMinimumWPętli(osobnicy, najlepszy, TSP.Instancja.licznikGłówny)); osobnicy = rodzice; TSP.Instancja.licznikGłówny++; }
public static Osobnik PorównajOsobników(Osobnik osobnik1, Osobnik osobnik2) { if (osobnik1.SzybkośćTrasy() < osobnik2.SzybkośćTrasy()) { if (osobnik1.SzybkośćTrasy() != 0) { return(osobnik1); } else if (osobnik2.SzybkośćTrasy() != 0) { return(osobnik2); } else { return(osobnik1); } } else { return(osobnik2); } }
private Osobnik ZnajdźMinimumWPętli(List <Osobnik> rodzice, Osobnik najlepszy, int licznikGłówny) { for (int i = 0; i < rodzice.Count; i++) { if (najlepszy.ocena > rodzice[i].ocena) { najlepszy = rodzice[i]; StringBuilder iteracja = new StringBuilder(); iteracja.Append("Iteracja: "); iteracja.Append(licznikGłówny.ToString()); iteracja.Append((licznikGłówny > 100000) ? "\t" : "\t\t"); Console.Write(iteracja); //Console.Write("Iteracja: " + licznikGłówny + "\t"); Console.Write("Minimum wynosi: " + najlepszy.ocena + "\t"); for (int j = 0; j < najlepszy.ocena / 1000; j++) { Console.Write("*"); } Console.WriteLine(); } } return(najlepszy); }
static Osobnik KrzyżowanieOX(Osobnik tata, Osobnik mama) { int punkt1 = Program.random.Next(tata.genotyp.Count); int punkt2 = Program.random.Next(tata.genotyp.Count); if (punkt1 > punkt2) { int temp = punkt1; punkt1 = punkt2; punkt2 = temp; } Osobnik dziecko = new Osobnik(); for (int i = punkt1 + 1; i <= punkt2; i++) { dziecko.genotyp.Add(tata.genotyp[i]); } for (int i = 0; i < tata.genotyp.Count; i++) { if (!dziecko.genotyp.Contains(mama.genotyp[i])) { dziecko.genotyp.Add(mama.genotyp[i]); } } if (Program.random.NextDouble() < Program.prawdopodobieństwoMutacji) { dziecko = dziecko.Mutacja(); } Program.niebo = Osobnik.PorównajOsobników(dziecko, Program.niebo); return(dziecko); }
public Osobnik(Osobnik o) { this.id = o.id; this.ocena = o.ocena; this.trasa = o.trasa; }
static Osobnik KrzyżowaniePrzezWymianęPodtras(Osobnik tata, Osobnik mama) { SortedList <int, int> tataGenotypSąsiedztwa = ZmianaReprezentacjiNaSąsiedztwa(tata); SortedList <int, int> mamaGenotypSąsiedztwa = ZmianaReprezentacjiNaSąsiedztwa(mama); SortedList <int, int> dzieckoGenotypSąsiedztwa = new SortedList <int, int>(); int długośćOsobnika = tataGenotypSąsiedztwa.Count; bool flaga = false; //mama int punktPoczątkowy = Program.random.Next(1, tataGenotypSąsiedztwa.Count); int długośćObecnejPodtrasy = Program.random.Next(1, tataGenotypSąsiedztwa.Count); int losowyIndeksRodzica = 0; int wylosowanaWartość = 0; dzieckoGenotypSąsiedztwa.Add(punktPoczątkowy, tataGenotypSąsiedztwa[punktPoczątkowy]); int ostatnioDodanyKluczDziecka = punktPoczątkowy; int ostatnioDodanaWartośćDziecka = tataGenotypSąsiedztwa[punktPoczątkowy]; tataGenotypSąsiedztwa.Remove(ostatnioDodanyKluczDziecka); tataGenotypSąsiedztwa.RemoveAt(tataGenotypSąsiedztwa.IndexOfValue(ostatnioDodanyKluczDziecka)); mamaGenotypSąsiedztwa.Remove(ostatnioDodanyKluczDziecka); mamaGenotypSąsiedztwa.RemoveAt(mamaGenotypSąsiedztwa.IndexOfValue(ostatnioDodanyKluczDziecka)); while (dzieckoGenotypSąsiedztwa.Count < długośćOsobnika - 1) { if (tataGenotypSąsiedztwa.Count < mamaGenotypSąsiedztwa.Count) { długośćObecnejPodtrasy = Program.random.Next(1, tataGenotypSąsiedztwa.Count); } else { długośćObecnejPodtrasy = Program.random.Next(1, mamaGenotypSąsiedztwa.Count); } if (flaga == true) //tata { for (int i = 0; i < długośćObecnejPodtrasy; i++) { if (tataGenotypSąsiedztwa.ContainsKey(ostatnioDodanaWartośćDziecka) && !dzieckoGenotypSąsiedztwa.ContainsValue(tataGenotypSąsiedztwa[ostatnioDodanaWartośćDziecka])) { dzieckoGenotypSąsiedztwa.Add(ostatnioDodanaWartośćDziecka, tataGenotypSąsiedztwa[ostatnioDodanaWartośćDziecka]); ostatnioDodanyKluczDziecka = ostatnioDodanaWartośćDziecka; ostatnioDodanaWartośćDziecka = tataGenotypSąsiedztwa[ostatnioDodanaWartośćDziecka]; if (mamaGenotypSąsiedztwa.ContainsValue(ostatnioDodanaWartośćDziecka)) { mamaGenotypSąsiedztwa.RemoveAt(mamaGenotypSąsiedztwa.IndexOfValue(ostatnioDodanaWartośćDziecka)); } tataGenotypSąsiedztwa.Remove(ostatnioDodanyKluczDziecka); } else //jeśli dziecko już zawiera tę wartość, losujemy jakąś inną z puli wartości taty { losowyIndeksRodzica = Program.random.Next(tataGenotypSąsiedztwa.Count); wylosowanaWartość = tataGenotypSąsiedztwa[tataGenotypSąsiedztwa.Keys[losowyIndeksRodzica]]; if (!dzieckoGenotypSąsiedztwa.ContainsValue(wylosowanaWartość)) { dzieckoGenotypSąsiedztwa.Add(ostatnioDodanaWartośćDziecka, wylosowanaWartość); ostatnioDodanyKluczDziecka = ostatnioDodanaWartośćDziecka; ostatnioDodanaWartośćDziecka = wylosowanaWartość; if (mamaGenotypSąsiedztwa.ContainsValue(ostatnioDodanaWartośćDziecka)) { mamaGenotypSąsiedztwa.RemoveAt(mamaGenotypSąsiedztwa.IndexOfValue(ostatnioDodanaWartośćDziecka)); } tataGenotypSąsiedztwa.Remove(ostatnioDodanyKluczDziecka); } } } flaga = false; } else //mama { for (int i = 0; i < długośćObecnejPodtrasy; i++) { if (mamaGenotypSąsiedztwa.ContainsKey(ostatnioDodanaWartośćDziecka) && !dzieckoGenotypSąsiedztwa.ContainsValue(mamaGenotypSąsiedztwa[ostatnioDodanaWartośćDziecka])) { dzieckoGenotypSąsiedztwa.Add(ostatnioDodanaWartośćDziecka, mamaGenotypSąsiedztwa[ostatnioDodanaWartośćDziecka]); ostatnioDodanyKluczDziecka = ostatnioDodanaWartośćDziecka; ostatnioDodanaWartośćDziecka = mamaGenotypSąsiedztwa[ostatnioDodanaWartośćDziecka]; if (tataGenotypSąsiedztwa.ContainsValue(ostatnioDodanaWartośćDziecka)) { tataGenotypSąsiedztwa.RemoveAt(tataGenotypSąsiedztwa.IndexOfValue(ostatnioDodanaWartośćDziecka)); } mamaGenotypSąsiedztwa.Remove(ostatnioDodanyKluczDziecka); } else { losowyIndeksRodzica = Program.random.Next(mamaGenotypSąsiedztwa.Count); wylosowanaWartość = mamaGenotypSąsiedztwa[mamaGenotypSąsiedztwa.Keys[losowyIndeksRodzica]]; if (!dzieckoGenotypSąsiedztwa.ContainsValue(wylosowanaWartość)) { dzieckoGenotypSąsiedztwa.Add(ostatnioDodanaWartośćDziecka, wylosowanaWartość); ostatnioDodanyKluczDziecka = ostatnioDodanaWartośćDziecka; ostatnioDodanaWartośćDziecka = wylosowanaWartość; if (tataGenotypSąsiedztwa.ContainsValue(ostatnioDodanaWartośćDziecka)) { tataGenotypSąsiedztwa.RemoveAt(tataGenotypSąsiedztwa.IndexOfValue(ostatnioDodanaWartośćDziecka)); } mamaGenotypSąsiedztwa.Remove(ostatnioDodanyKluczDziecka); } } } flaga = true; } } dzieckoGenotypSąsiedztwa.Add(ostatnioDodanaWartośćDziecka, punktPoczątkowy); Osobnik dziecko = ZmianaReprezentacjiNaŚcieżkową(dzieckoGenotypSąsiedztwa); if (Program.random.NextDouble() < Program.prawdopodobieństwoMutacji) { dziecko = dziecko.Mutacja(); } Program.niebo = Osobnik.PorównajOsobników(dziecko, Program.niebo); return(dziecko); }