public override EndCriteria.Type minimize(Problem P, EndCriteria endCriteria)
{
EndCriteria.Type ecType = EndCriteria.Type.None;
upperBound_ = P.constraint().upperBound(P.currentValue());
lowerBound_ = P.constraint().lowerBound(P.currentValue());
currGenSizeWeights_ = new Vector(configuration().populationMembers,
configuration().stepsizeWeight);
currGenCrossover_ = new Vector(configuration().populationMembers,
configuration().crossoverProbability);
List <Candidate> population = new InitializedList <Candidate>(configuration().populationMembers);
population.ForEach((ii, vv) => population[ii] = new Candidate(P.currentValue().size()));
fillInitialPopulation(population, P);
//original quantlib use partial_sort as only first elements is needed
double fxOld = population.Min(x => x.cost);
bestMemberEver_ = (Candidate)population.First(x => x.cost.IsEqual(fxOld)).Clone();
int iteration = 0, stationaryPointIteration = 0;
// main loop - calculate consecutive emerging populations
while (!endCriteria.checkMaxIterations(iteration++, ref ecType))
{
calculateNextGeneration(population, P.costFunction());
double fxNew = population.Min(x => x.cost);
Candidate tmp = (Candidate)population.First(x => x.cost.IsEqual(fxNew)).Clone();
if (fxNew < bestMemberEver_.cost)
{
bestMemberEver_ = tmp;
}
if (endCriteria.checkStationaryFunctionValue(fxOld, fxNew, ref stationaryPointIteration,
ref ecType))
{
break;
}
fxOld = fxNew;
}
P.setCurrentValue(bestMemberEver_.values);
P.setFunctionValue(bestMemberEver_.cost);
return(ecType);
}