static void Main(String[] args) { //设置染色体组 //设置最优染色体 //设置子染色体组 //检查是否达到最优 //变异操作 //记录每次最优的情况 //按照适应度对种群的个体进行排序 /* * func SortSuit() * { * * } */ GA g = new GA(); g.initialization(); g.caculatefitness(); }
public void breed() { if (ga == null) { ga = new GA.GA <NEAT.Person>(player.weapon, new GA.Selection.NEAT_Selection(), new GA.Crossover.NEAT_Crossover(), new GA.Mutation.NEAT_Mutation(), new GA.Fitness.NEAT_Fitness(), 10, 0.05f, 0.1f); } else { ga.updatePopulation(player.usedWepons); ga.updateParameters(ga.population_size, ga.elitesP, crossoverP); } ga.breed(); crossoverP += 0.01f; if (crossoverP > 0.6f) { crossoverP = 0.6f; } player.usedWepons.Clear(); /*System.Random random = new System.Random(); * player.weapon = new List<NEAT.Person>() { ga.results[random.Next(ga.results.Count - 1)], ga.results[random.Next(ga.results.Count - 1)], ga.results[random.Next(ga.results.Count - 1)] }; * player.chosenW = player.weapon[0]; * player.chosenW.buildModel();*/ }
static void Main(string[] args) { //真实数据集 //string[] filepath = { "../Data/RealData/S1_500.txt", "../Data/RealData/S2_500.txt", "../Data/RealData/S3_500.txt", "../Data/RealData/S4_500.txt", "../Data/RealData/S5_500.txt" };//数据集规模500 string[] filepath = { "../Data/RealData/S1_400.txt", "../Data/RealData/S2_400.txt", "../Data/RealData/S3_400.txt", "../Data/RealData/S4_400.txt", "../Data/RealData/S5_400.txt" };//数据集规模400 //string[] filepath = { "../Data/RealData/S1_300.txt", "../Data/RealData/S2_300.txt", "../Data/RealData/S3_300.txt", "../Data/RealData/S4_300.txt", "../Data/RealData/S5_300.txt" };//数据集规模300 //string[] filepath = { "../Data/RealData/S1_200.txt", "../Data/RealData/S2_200.txt", "../Data/RealData/S3_200.txt", "../Data/RealData/S4_200.txt", "../Data/RealData/S5_200.txt" };//数据集规模200 //string[] filepath = { "../Data/RealData/S1_100.txt", "../Data/RealData/S2_100.txt", "../Data/RealData/S3_100.txt", "../Data/RealData/S4_100.txt", "../Data/RealData/S5_100.txt" };//数据集规模100 //随机数据集 //string[] filepath = { "../Data/Random/S1_500.txt", "../Data/Random/S2_500.txt", "../Data/Random/S3_500.txt", "../Data/Random/S4_500.txt", "../Data/Random/S5_500.txt" };//数据集规模500 //string[] filepath = { "../Data/Random/S1_400.txt", "../Data/Random/S2_400.txt", "../Data/Random/S3_400.txt", "../Data/Random/S4_400.txt", "../Data/Random/S5_400.txt" };//数据集规模400 //string[] filepath = { "../Data/Random/S1_300.txt", "../Data/Random/S2_300.txt", "../Data/Random/S3_300.txt", "../Data/Random/S4_300.txt", "../Data/Random/S5_300.txt" };//数据集规模300 //string[] filepath = { "../Data/Random/S1_200.txt", "../Data/Random/S2_200.txt", "../Data/Random/S3_200.txt", "../Data/Random/S4_200.txt", "../Data/Random/S5_200.txt" };//数据集规模200 //string[] filepath = { "../Data/Random/S1_100.txt", "../Data/Random/S2_100.txt", "../Data/Random/S3_100.txt", "../Data/Random/S4_100.txt", "../Data/Random/S5_100.txt" };//数据集规模100 GA_Server bestserver = new GA_Server(); List <GA_Server> scrlist = new List <GA_Server>(); List <Server>[] wlist = new List <Server> [ConstNum.PARTICE_DIM]; double fit = 0, totaltime = 0; wlist = GetData.splitedatafromfile(filepath, ConstNum.PARTICE_DIM); Timing dobj = new Timing(); int sum = 0; double totalfit = 0; double RMSE = 0; double[] ttfit = new double[101]; for (int i = 0; i < 100; i++) { scrlist = GA_Server.GetinitGA_server(wlist); dobj.startTime(); bestserver = GA.GetBest(scrlist, wlist, ref fit); dobj.StopTime(); totaltime += dobj.Result().Milliseconds; totaltime += dobj.Result().Seconds * 1000; totalfit += fit; ttfit[i] = fit; if (Math.Abs(fit - 0.5608) <= 0.0005)//QWS--500,400 { sum++; } //if (Math.Abs(fit - 0.6835) <= 0.0005)//QWS-300 //{ // sum++; //} //if (Math.Abs(fit - 0.7802) <= 0.0005)//QWS-200 //{ // sum++; //} //if (Math.Abs(fit - 0.8733) <= 0.0005)//QWS-100 //{ // sum++; //} //if (Math.Abs(fit - 1.4482) <= 0.0005)//RWS--500 //{ // sum++; //} //if (Math.Abs(fit - 1.4569) <= 0.0005)//RWS--400 //{ // sum++; //} //if (Math.Abs(fit - 1.4742) <= 0.0005)//RWS--300 //{ // sum++; //} //if (Math.Abs(fit - 1.5292) <= 0.0005)//RWS--200 //{ // sum++; //} //if (Math.Abs(fit - 1.5711) <= 0.0005)//RWS--100 //{ // sum++; //} Console.WriteLine("Best fit={0}", fit); Console.WriteLine("The Best combination is {0},{1},{2},{3},{4}", bestserver.getIndextask(0), bestserver.getIndextask(1), bestserver.getIndextask(2), bestserver.getIndextask(3), bestserver.getIndextask(4)); Console.WriteLine("The time cost is {0}ms,{1}s,********{2}", dobj.Result().Milliseconds, dobj.Result().Seconds, sum); } //求均方根误差 for (int i = 0; i < 100; i++) { RMSE += (ttfit[i] - totalfit / 100) * (ttfit[i] - totalfit / 100); } RMSE = RMSE / 100; RMSE = Math.Sqrt(RMSE); //Console.WriteLine("Average is {0},time is {1},RMSE is {2},*******{3}", totalfit/ 100, totaltime / 100,RMSE,(double)sum/100); Console.WriteLine("Average is {0}", totalfit / 100); Console.WriteLine("time is {0}", totaltime / 100); Console.WriteLine("RMSE is {0}", RMSE); Console.WriteLine("*******{0}", (double)sum / 100); Console.ReadKey(); }
static void Main(string[] args) { int numberOfGenerations = 50; string[,] results = new string[numberOfGenerations, 7]; for (int i = 0; i < numberOfGenerations; i++) { Console.Clear(); Console.Write($"Number of Executions {i + 1}/{numberOfGenerations}"); GA ga = new GA(); ga.firstPop(); ga.population = ga.population.OrderByDescending(x => x.fitness).ToList(); int geracoesComResultadoIgual = 0; double melhorFitness = 0; for (int j = 0; j < ga.NUMBER_GENERATIONS; j++) { melhorFitness = ga.population.First().fitness; ga.Crossover(); ga.Mutation(); ga.Elitism(); ga.NextGenerationSelection(); // Tratamento para retirar convergencia local if (melhorFitness == ga.population.First().fitness) { geracoesComResultadoIgual++; } else { geracoesComResultadoIgual = 0; } if (geracoesComResultadoIgual == 6) { ga.firstPop(); geracoesComResultadoIgual = 0; } } results[i, 0] = ga.POP_SIZE.ToString(); results[i, 1] = ga.NUMBER_GENERATIONS.ToString(); results[i, 2] = (100 * ga.MUTATION_RATE).ToString(); results[i, 3] = (100 * ga.REPRODUCTION_RATE).ToString(); results[i, 4] = ga.population.First().x.ToString("0.0000"); results[i, 5] = ga.population.First().y.ToString("0.0000"); results[i, 6] = ga.population.First().fitness.ToString("0.0000"); } //Dá saída em um arquivo var nomeArquivo = $"Results GA{DateTime.Now.ToString("yyyyMMdd-HHmmffff")}.txt"; var fileDirectory = System.AppDomain.CurrentDomain.BaseDirectory.ToString() + nomeArquivo; if (!System.IO.File.Exists(fileDirectory)) { using (System.IO.File.Create(fileDirectory)) { } } using (System.IO.StreamWriter file = new System.IO.StreamWriter(fileDirectory, true)) { file.WriteLine("-------------------------- Results --------------------------\n\n"); file.WriteLine(String.Format("Fitness|Execução|POP Size|Number of Generations|Mutation Rate|Crossover Rate|X |Y")); for (int i = 0; i < numberOfGenerations; i++) { file.WriteLine(String.Format("{7}|{0}|{1}|{2}|{3}|{4}|{5}|{6}", (i + 1).ToString().PadRight(8), results[i, 0].PadRight(20), results[i, 1].PadRight(18), (results[i, 2] + "%").PadRight(15), (results[i, 3] + "%").PadRight(17), results[i, 4].PadLeft(7), results[i, 5].PadLeft(7), results[i, 6].PadLeft(7))); } file.Write("\n\n------------------------------------------------------------------------"); } System.Diagnostics.Process.Start(fileDirectory); Console.ReadKey(); System.IO.File.Delete(fileDirectory); }
// Start is called before the first frame update void Start() { /*var watch = System.Diagnostics.Stopwatch.StartNew(); * * * a = (NEAT.Person)ScriptableObject.CreateInstance("NEAT.Person"); * * NEAT.GENES.Node a1 = new NEAT.GENES.Node(NEAT.GENES.Node.NODE.IN, 0); * NEAT.GENES.Node a2 = new NEAT.GENES.Node(NEAT.GENES.Node.NODE.IN, 1); * NEAT.GENES.Node b1 = new NEAT.GENES.Node(NEAT.GENES.Node.NODE.HIDDEN, 2); * NEAT.GENES.Node c1 = new NEAT.GENES.Node(NEAT.GENES.Node.NODE.HIDDEN, 3); * NEAT.GENES.Node d1 = new NEAT.GENES.Node(NEAT.GENES.Node.NODE.OUT, 4); * NEAT.GENES.Node d2 = new NEAT.GENES.Node(NEAT.GENES.Node.NODE.OUT, 5); * * NEAT.GENES.Connection a1b1 = new NEAT.GENES.Connection(a1.nb, b1.nb, 0.5f); * NEAT.GENES.Connection a2b1 = new NEAT.GENES.Connection(a2.nb, b1.nb, 0.5f); * NEAT.GENES.Connection b1c1 = new NEAT.GENES.Connection(b1.nb, c1.nb, 0.5f); * NEAT.GENES.Connection c1d1 = new NEAT.GENES.Connection(c1.nb, d1.nb, 0.5f); * NEAT.GENES.Connection a1d1 = new NEAT.GENES.Connection(a1.nb, d1.nb, 0.5f); * NEAT.GENES.Connection c1d2 = new NEAT.GENES.Connection(c1.nb, d2.nb, 0.5f); * NEAT.GENES.Connection b1d2 = new NEAT.GENES.Connection(b1.nb, d2.nb, 0.2f); * a.node_gene.Add(a1); * a.node_gene.Add(a2); * a.node_gene.Add(b1); * a.node_gene.Add(c1); * a.node_gene.Add(d1); * a.node_gene.Add(d2); * * a.node_connect.Add(a1b1); * a.node_connect.Add(a2b1); * a.node_connect.Add(b1c1); * a.node_connect.Add(c1d1); * a.node_connect.Add(a1d1); * a.node_connect.Add(c1d2); * a.node_connect.Add(b1d2); * * a.buildModel(); * watch.Stop(); * Debug.Log(watch.ElapsedMilliseconds); * * List<float> inputs = new List<float>(); * inputs.Add(0.5f); * inputs.Add(0.5f); * Debug.Log(a.network.evaluate(inputs)[0]); * Debug.Log(a.network.evaluate(inputs)[1]);*/ //a.instantiate(); a.buildModel(); //b.instantiate(); b.buildModel(); c.buildModel(); foreach (NEAT.GENES.Connection connection in a.node_connect) { NEAT.GENES.Connection.addConnection(connection); } foreach (NEAT.GENES.Connection connection in b.node_connect) { NEAT.GENES.Connection.addConnection(connection); } foreach (NEAT.GENES.Connection connection in c.node_connect) { NEAT.GENES.Connection.addConnection(connection); } List <NEAT.Person> population = new List <NEAT.Person>(); population.Add(a); population.Add(b); population.Add(c); Debug.Log(a); Debug.Log(b); Debug.Log(c); NEAT.GENES.Connection.global_innov = 7; ga = new GA.GA <NEAT.Person>(population, new GA.Selection.NEAT_Selection(), new GA.Crossover.NEAT_Crossover(), new GA.Mutation.NEAT_Mutation(), new GA.Fitness.NEAT_Fitness(), 10, 0.05f, 0.2f); //ga.breed(); //for (int i = 0; i < ga.results.Count; i++) // Debug.Log(ga.results[i]); //a.network.randomizeWeight(); chosen = a; }