public double Evaluate(IChromosome chromosome) { List <Droga> listaDrog = Program.drogi; var geny = chromosome.GetGenes(); var sumaOdleglosci = 0.0; var ostatni = 0; for (int i = 0; i < geny.Length; i++) { var IndexDrogi = Convert.ToInt32(geny[i].Value, CultureInfo.InvariantCulture); Droga drogaPowrotna = listaDrog.Find(a => (a.pktPoczatkowy.ToString() + "-" + a.pktNastepny.ToString()).Equals(listaDrog[IndexDrogi].pktNastepny.ToString() + "-" + listaDrog[IndexDrogi].pktPoczatkowy.ToString())); listaDrog[IndexDrogi].czyDotarl = true; // ustawienie drogi jako przebytą drogaPowrotna.czyDotarl = true; // ustawienie odwrotności drogi jako przebytą if (i != 0 && listaDrog[IndexDrogi].pktPoczatkowy != listaDrog[Convert.ToInt32(geny[i - 1].Value)].pktNastepny) { sumaOdleglosci += listaDrog[IndexDrogi].koszt * 1000; } else { sumaOdleglosci += listaDrog[IndexDrogi].koszt; } if (czyKazdaDrogaZostalaPokonana(listaDrog)) { if (listaDrog[IndexDrogi].pktNastepny == listaDrog[Convert.ToInt32(geny[0].Value)].pktPoczatkowy) { break; } } ostatni = IndexDrogi; } if (!czyKazdaDrogaZostalaPokonana(listaDrog) || (listaDrog[ostatni].pktPoczatkowy != listaDrog[Convert.ToInt32(geny[0].Value)].pktPoczatkowy)) { sumaOdleglosci = sumaOdleglosci * 999; } foreach (Droga droga in Program.drogi) { droga.czyDotarl = false; } var fitness = 1.0 / sumaOdleglosci; return(fitness); }
static void Main(string[] args) { // grafy o różnej liczbie wierzchołków h7 h9 h20 h23 h25 h47 string loc = Directory.GetCurrentDirectory() + "\\Grafy\\h7.txt"; int[,] data = LoadData.FromFile(loc); drogi = new List <Droga>(); for (int i = 0; i < data.GetLength(0); i++) { Droga nowaDroga = new Droga(data[i, 0], data[i, 1], data[i, 2]); drogi.Add(nowaDroga); Droga powrotnaDroga = new Droga(data[i, 1], data[i, 0], data[i, 2]); drogi.Add(powrotnaDroga); } System.Console.WriteLine("Lista drog :"); foreach (Droga droga in drogi) { System.Console.WriteLine(droga.pktPoczatkowy + " " + droga.pktNastepny + " " + droga.koszt); } Console.WriteLine("liczba dróg : " + drogi.Count); Console.WriteLine(); var selection = new EliteSelection(); var crossover = new ThreeParentCrossover(); //dwóch rodziców dwojka dzieci TwoPointCrossover();// var mutation = new TworsMutation(); // zmiana pozycji dwóch genów bybranych losowo var fitness = new PostmanFitness(); var chromosome = new PostmanChromosome(3 * drogi.Count); var population = new Population(30, 30, chromosome); var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation); ga.CrossoverProbability = 0.90F; ga.MutationProbability = 0.05F; ga.Termination = new GenerationNumberTermination(800); Console.WriteLine("Prawdopodobieństwo krzyżowania: " + ga.CrossoverProbability); Console.WriteLine("Prawdopodobieństwo mutacji: " + ga.MutationProbability); Stopwatch timer = new Stopwatch(); timer.Start(); Console.WriteLine("Obliczanie..."); ga.Start(); Console.WriteLine("Koniec obliczeń"); timer.Stop(); bool pierwszy = true; int miastoStartoweIndex = Convert.ToInt32(ga.BestChromosome.GetGenes()[0].Value); int miastoStartowe = drogi[miastoStartoweIndex].pktPoczatkowy; int kosztCalkowity = 0; foreach (Gene gene in ga.BestChromosome.GetGenes()) { int index = Convert.ToInt32(gene.Value); kosztCalkowity += drogi[index].koszt; if (PostmanFitness.czyKazdaDrogaZostalaPokonana(drogi) && drogi[index].pktNastepny == miastoStartowe) { Console.Write("-" + drogi[index].pktNastepny.ToString()); break; } else { if (pierwszy) { Console.Write(drogi[index].pktPoczatkowy.ToString() + "-" + drogi[index].pktNastepny.ToString()); pierwszy = false; } else { Console.Write("-" + drogi[index].pktNastepny.ToString()); } drogi[index].czyDotarl = true; Droga drogaPowrotna = drogi.Find(a => (a.pktPoczatkowy.ToString() + "-" + a.pktNastepny.ToString()).Equals(drogi[index].pktNastepny.ToString() + "-" + drogi[index].pktPoczatkowy.ToString())); drogaPowrotna.czyDotarl = true; } } TimeSpan ts = timer.Elapsed; string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10); Console.WriteLine(); Console.WriteLine("Czas obliczeń : {0}", elapsedTime); Console.WriteLine("Całkowity koszt przebytej trasy : {0}", kosztCalkowity); Console.ReadKey(); }