public override T Solve(T solution, Criterion <T> criterion) { ResetToInitialState(); var iter = 0; solution.Reset(); _saver?.Open(); criterion.InitialEvaluation(solution); var bestSol = (T)solution.Clone(); var solBeforeMove = (T)solution.Clone(); while (!StopCriteria.ShouldStop(solution)) { solution.Copy(solBeforeMove); Mover.MoveSolution(solution); criterion.CalculateSolutionPenalty(solution); if (IsMovedBetter(solution, solBeforeMove, criterion)) { if (criterion.IsFirstOneBetter(solution, bestSol)) { solution.Copy(bestSol); } } else { solBeforeMove.Copy(solution); } AtEndOfIteration(iter); _saver?.AppendToFile(bestSol); iter++; } Logger.LogInformation($"Finished in: '{iter}' iterations"); _saver?.Close(); if (!bestSol.IsFeasible) { throw new Exception("No feasible solution was found"); } solution = bestSol; return(solution); }