/// <summary> /// Starts Training /// </summary> private void StartTraining() { balacing.IterationCompleted += Balacing_IterationCompleted; balacing.IterationStarted += Balacing_IterationStarted; Genetics.Individuum <Genetics.Decision> best = balacing.Do(); Console.WriteLine("Best: " + best.Fitness.ToString() + ", Iterations: " + iterations.ToString() + " => results saved!"); TrainingFinished?.Invoke(this, EventArgs.Empty); }
/// <summary> /// Outputs best individuum after each iteration /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Balacing_IterationCompleted(object sender, Genetics.IterationArgs <Genetics.Decision> e) { sw.Stop(); bool save = false; bool spacing = false; if (best != null) { if (e.Best.Fitness > best.Fitness) //individuum has a higher fitness { save = true; } else if (e.Best.Fitness == best.Fitness) //Individuum has the same fitness { for (int i = 0; i < e.Best.Data.Length; i++) //Check if data array are not-equal { if (e.Best.Data[i] != best.Data[i]) { save = true; //not equal save break; } } } } else { save = true; spacing = true; } if (save) { best = e.Best; //set new best StringBuilder sb = new StringBuilder(); if (spacing) { sb.Append(Environment.NewLine); sb.Append("============================================="); sb.Append(Environment.NewLine); sb.Append("============================================="); sb.Append(Environment.NewLine); sb.Append("=========== NEW TRAININGS SESSION ==========="); sb.Append(Environment.NewLine); sb.Append("============================================="); sb.Append(Environment.NewLine); sb.Append("============================================="); sb.Append(Environment.NewLine); } sb.Append("Iteration: "); sb.Append(e.Iteration.ToString()); sb.Append(Environment.NewLine); sb.Append("Best: "); sb.Append(e.Best.Fitness.ToString()); sb.Append(Environment.NewLine); sb.Append("Duration: "); sb.Append(sw.ElapsedMilliseconds.ToString()); sb.Append(Environment.NewLine); sb.Append("Primary weapon: "); sb.Append(level.PrimaryWeapons[e.Best.Data[0].Value].Name); sb.Append(Environment.NewLine); sb.Append("Primary suspressed: "); sb.Append(e.Best.Data[1].Value == 1 ? "Yes" : "No"); sb.Append(Environment.NewLine); sb.Append("Secndary weapon:"); sb.Append(level.SecondaryWeapons[e.Best.Data[2].Value].Name); sb.Append(Environment.NewLine); sb.Append("Secondary suspressed: "); sb.Append(e.Best.Data[3].Value == 1 ? "Yes" : "No"); sb.Append(Environment.NewLine); sb.Append("Entry index: "); sb.Append(e.Best.Data[4].Value.ToString()); sb.Append(" Entry Position: "); sb.Append(entryPositions[e.Best.Data[4].Value].ToString()); sb.Append(Environment.NewLine); sb.Append("Exit index: "); sb.Append(e.Best.Data[5].Value.ToString()); sb.Append(" Exit Position: "); sb.Append(entryPositions[e.Best.Data[5].Value].ToString()); sb.Append(Environment.NewLine); sb.Append("==================================================="); sb.Append(Environment.NewLine); File.AppendAllText("decisions.txt", sb.ToString()); } Console.WriteLine("Iteration " + (e.Iteration + 1).ToString() + " completed: Best = " + e.Best.Fitness.ToString()); }