/// <summary> /// Generally two termination criteria are available. Iteration count and best fitness value. /// </summary> /// <param name="tc"></param> /// <param name="counter"></param> /// <param name="bestFitness"></param> /// <returns></returns> private bool isCriteriaSatisfied(TerminationCriteria tc, int counter, float bestFitness) { if (tc.IsIteration) { return(counter >= tc.Value); } else { return(bestFitness >= tc.Value); } }
public async Task RunAsync(Action <ProgressReport, Parameters> reportProgress, TerminationCriteria tc, CancellationToken ct) { m_TerminationCriteria = tc; await Task.Run(() => startEvolution(reportProgress, tc, ct)); }
/// <summary> /// Start with evolution /// </summary> /// <param name="reportProgress"></param> /// <param name="tc"></param> /// <param name="ct"></param> private void startEvolution(Action <ProgressReport, Parameters> reportProgress, TerminationCriteria tc, CancellationToken ct) { Stopwatch sp = new Stopwatch(); try { //send report population initialized and evaluated m_History.Add(initEvolution(m_progresReport)); reportProgress(m_progresReport, m_Parameters); //init termination criteria int iterationCount = m_progresReport.Iteration; m_progresReport.IterationStatus = IterationStatus.Runing; // float bestFitness = 0; bool breakLoop = false; while (!breakLoop) { //report progress sp.Restart(); m_progresReport.IterationStatus = IterationStatus.Runing; iterationCount++; // performIteration(m_progresReport, ct); //get best solution for the current iteration bestFitness = m_progresReport.BestSolution.Fitness; //check for termination criteria if (isCriteriaSatisfied(tc, iterationCount, bestFitness) || bestFitness == 1000) { //stopping iteration m_progresReport.IterationStatus = IterationStatus.Compleated; breakLoop = true; } //check for cancellation criteria if (ct.IsCancellationRequested) { //canceling iteration m_progresReport.IterationStatus = IterationStatus.Stopped; breakLoop = true; } //report progress m_progresReport.Iteration = iterationCount; //pr.BestSolution= bestFitness m_progresReport.IterationStatistics.IterationSeconds = (float)sp.Elapsed.TotalSeconds; //send report and store in history m_History.Add(initEvolution(m_progresReport)); reportProgress(m_progresReport, m_Parameters); } } catch (Exception ex) { m_progresReport.IterationStatus = IterationStatus.Exception; m_progresReport.Message = ex.Message; m_History.Add(initEvolution(m_progresReport)); reportProgress(m_progresReport, m_Parameters); // throw; } }
public void GPFactoryFromString(string strFactory) { if (string.IsNullOrEmpty(strFactory)) { return; } try { Evolution[] hist = null; JsonSerializerSettings sett = new JsonSerializerSettings(); sett.NullValueHandling = NullValueHandling.Ignore; var obj = JsonConvert.DeserializeObject(strFactory, sett); var param = ((dynamic)obj)["m_Parameters"] as Newtonsoft.Json.Linq.JObject; var ter = ((dynamic)obj)["m_TerminalSet"] as Newtonsoft.Json.Linq.JArray; var fun = ((dynamic)obj)["m_FunctionSet"] as Newtonsoft.Json.Linq.JArray; var prog = ((dynamic)obj)["m_progresReport"] as Newtonsoft.Json.Linq.JObject; var tc = ((dynamic)obj)["m_TerminationCriteria"] as Newtonsoft.Json.Linq.JObject; var hi = ((dynamic)obj)["history"] as Newtonsoft.Json.Linq.JArray; var pop = ((dynamic)obj)["popStr"] as Newtonsoft.Json.Linq.JValue; if (param != null) { m_Parameters = param.ToObject <Parameters>(); } if (ter != null) { m_TerminalSet = ter.ToObject <int[]>(); } if (fun != null) { m_FunctionSet = fun.ToObject <Function[]>(); } if (prog != null) { m_progresReport = prog.ToObject <ProgressReport>(); } if (tc != null) { m_TerminationCriteria = tc.ToObject <TerminationCriteria>(); } if (hi != null) { hist = hi.ToObject <Evolution[]>(); } //create history if (hist != null) { m_History = new List <Evolution>(hist); } m_Population = new Population(); if (pop != null) { var popStr = pop.ToObject <string>(); m_Population.PopulationFromString(popStr); } } catch (Exception) { throw; } }