-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathStopIfNoImprovment.cs
42 lines (36 loc) · 1.57 KB
/
StopIfNoImprovment.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;
using System.Collections.Generic;
using System.Linq;
using GeneticAlgorithm.Exceptions;
using GeneticAlgorithm.Interfaces;
namespace GeneticAlgorithm.StopManagers
{
public class StopIfNoImprovment : IStopManager
{
private readonly int generationsToConsider;
private readonly double minImprovment;
private readonly List<double> oldEvaluations = new List<double>();
/// <summary>
/// Stop if there isn't an improvement of at least "minImprovment" after "generationsToConsider" generations
/// </summary>
public StopIfNoImprovment(int generationsToConsider, double minImprovment)
{
this.generationsToConsider = generationsToConsider > 0
? generationsToConsider
: throw new GeneticAlgorithmArgumentException(nameof(generationsToConsider) + " must be greater then zero");
this.minImprovment = minImprovment;
}
public bool ShouldStop(Population population, IEnvironment environment, int generation)
{
var currentEvaluation = population.GetEvaluations().Max();
if (oldEvaluations.Count < generationsToConsider)
return false;
var min = oldEvaluations.Skip(generation - generationsToConsider).Take(generationsToConsider).Min();
return Math.Abs(currentEvaluation - min) <= minImprovment;
}
public void AddGeneration(Population population)
{
oldEvaluations.Add(population.GetEvaluations().Max());
}
}
}