コード例 #1
0
ファイル: HillClimbingAlgorithm.cs プロジェクト: Anav0/Optima
        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);
        }