Free cookie consent management tool by TermsFeed Policy Generator

Changeset 13770


Ignore:
Timestamp:
04/16/16 14:05:59 (8 years ago)
Author:
ichiriac
Message:

Fix the calculation of evaluation number

Location:
branches/ichiriac/HeuristicLab.Algorithms.DifferentialEvolution
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/ichiriac/HeuristicLab.Algorithms.DifferentialEvolution/DifferentialEvolution.cs

    r13710 r13770  
    1919    [StorableClass]
    2020    [Creatable(CreatableAttribute.Categories.PopulationBasedAlgorithms, Priority = 400)]
    21     public class DifferentialEvolution : BasicAlgorithm 
     21    public class DifferentialEvolution : BasicAlgorithm
    2222    {
    2323        public Func<IEnumerable<double>, double> Evaluation;
     
    200200            var ub = Problem.Bounds[0, 1];
    201201            var range = ub - lb;
    202 
     202            this.evals = 0;
    203203            double[,] populationOld = new double[PopulationSizeParameter.Value.Value, Problem.ProblemSize.Value];
    204204            double[,] mutationPopulation = new double[PopulationSizeParameter.Value.Value, Problem.ProblemSize.Value];
     
    222222            int best_index = 0;
    223223            double[] populationRow = new double[Problem.ProblemSize.Value];
    224 
     224            double[] qualityPopulation = new double[PopulationSizeParameter.Value.Value];
    225225            bestPopulation = getMatrixRow(populationOld, best_index);
    226226            RealVector bestPopulationVector = new RealVector(bestPopulation);
    227227            double bestPopulationValue = Obj(bestPopulationVector);
     228            qualityPopulation[best_index] = bestPopulationValue;
    228229            RealVector selectionVector;
    229230            RealVector trialVector;
     
    231232
    232233
    233             for (var i = 0; i < PopulationSizeParameter.Value.Value; i++)
     234            for (var i = 1; i < PopulationSizeParameter.Value.Value; i++)
    234235            {
    235236                populationRow = getMatrixRow(populationOld, i);
     
    237238
    238239                qtrial = Obj(trialVector);
     240                qualityPopulation[i] = qtrial;
    239241
    240242                if (qtrial > bestPopulationValue)
    241243                {
    242244                    bestPopulationVector = new RealVector(populationRow);
    243                     bestPopulationValue = Obj(bestPopulationVector);
     245                    bestPopulationValue = qtrial;
    244246                    best_index = i;
    245247                }
     
    250252            // Loop until iteration limit reached or canceled.
    251253            // todo replace with a function
    252             while (ResultsEvaluations < MaximumEvaluations
    253                 && !cancellationToken.IsCancellationRequested 
     254            while (ResultsIterations < MaximumEvaluations
     255                && !cancellationToken.IsCancellationRequested
    254256                && bestPopulationValue > Problem.BestKnownQuality.Value + ValueToReachParameter.Value.Value)
    255257            {
     
    262264                    //assure the selected vectors r0, r1 and r2 are different
    263265                    do
    264                      {
    265                          r0 = _random.Next(0, PopulationSizeParameter.Value.Value);
    266                      } while (r0 == i);
    267                      do
    268                      {
    269                          r1 = _random.Next(0, PopulationSizeParameter.Value.Value);
    270                      } while (r1 == i || r1 == r0);
    271                      do
    272                      {
    273                          r2 = _random.Next(0, PopulationSizeParameter.Value.Value);
    274                      } while (r2 == i || r2 == r0 || r2 == r1);
     266                    {
     267                        r0 = _random.Next(0, PopulationSizeParameter.Value.Value);
     268                    } while (r0 == i);
     269                    do
     270                    {
     271                        r1 = _random.Next(0, PopulationSizeParameter.Value.Value);
     272                    } while (r1 == i || r1 == r0);
     273                    do
     274                    {
     275                        r2 = _random.Next(0, PopulationSizeParameter.Value.Value);
     276                    } while (r2 == i || r2 == r0 || r2 == r1);
    275277
    276278                    for (int j = 0; j < getMatrixRow(mutationPopulation, i).Length; j++)
    277279                    {
    278                         mutationPopulation[i,j] = populationOld[r0,j] +
    279                             ScalingFactorParameter.Value.Value * (populationOld[r1,j] - populationOld[r2,j]);
     280                        mutationPopulation[i, j] = populationOld[r0, j] +
     281                            ScalingFactorParameter.Value.Value * (populationOld[r1, j] - populationOld[r2, j]);
    280282                        //check the problem upper and lower bounds
    281                         if (mutationPopulation[i,j] > ub) mutationPopulation[i,j] = ub;
    282                         if (mutationPopulation[i,j] < lb) mutationPopulation[i,j] = lb;
     283                        if (mutationPopulation[i, j] > ub) mutationPopulation[i, j] = ub;
     284                        if (mutationPopulation[i, j] < lb) mutationPopulation[i, j] = lb;
    283285                    }
    284286                }
     
    292294                        if (_random.NextDouble() <= CrossoverProbabilityParameter.Value.Value || j == rnbr)
    293295                        {
    294                             trialPopulation[i,j] = mutationPopulation[i,j];
     296                            trialPopulation[i, j] = mutationPopulation[i, j];
    295297                        }
    296298                        else
    297299                        {
    298                             trialPopulation[i,j] = populationOld[i,j];
     300                            trialPopulation[i, j] = populationOld[i, j];
    299301                        }
    300302                    }
     
    307309                    trialVector = new RealVector(getMatrixRow(trialPopulation, i));
    308310
    309                     var selectionEval = Obj(selectionVector);
    310                     var trailEval = Obj(trialVector);
    311 
    312                     if (trailEval < selectionEval)
     311                    var selectionEval = qualityPopulation[i];
     312                    var trialEval = Obj(trialVector);
     313
     314                    if (trialEval < selectionEval)
    313315                    {
    314316                        for (int j = 0; j < getMatrixRow(populationOld, i).Length; j++)
     
    316318                            populationOld[i, j] = trialPopulation[i, j];
    317319                        }
     320                        qualityPopulation[i] = trialEval;
    318321                    }
    319322                }
     
    323326                {
    324327                    selectionVector = new RealVector(getMatrixRow(populationOld, i));
    325                     var quality = Obj(selectionVector);
     328                    var quality = qualityPopulation[i];
    326329                    if (quality < bestPopulationValue)
    327330                    {
     
    337340                ResultsIterations = iterations;
    338341                ResultsBestSolution = bestPopulationVector;
    339                 ResultsBestQuality = bestPopulationValue; 
     342                ResultsBestQuality = bestPopulationValue;
    340343
    341344                //update the results in view
    342                 if (iterations % 10 == 0 ) ResultsQualitiesBest.Values.Add(bestPopulationValue);
     345                if (iterations % 10 == 0) ResultsQualitiesBest.Values.Add(bestPopulationValue);
    343346                if (bestPopulationValue < Problem.BestKnownQuality.Value + ValueToReachParameter.Value.Value)
    344347                {
     
    347350            }
    348351        }
    349        
     352
    350353        //evaluate the vector
    351354        public double Obj(RealVector x)
     
    353356            evals = evals + 1;
    354357            if (Problem.Maximization.Value)
    355             return -Problem.Evaluator.Evaluate(x);
     358                return -Problem.Evaluator.Evaluate(x);
    356359
    357360            return Problem.Evaluator.Evaluate(x);
     
    359362
    360363        // Get ith row from the matrix
    361         public double[] getMatrixRow (double[,] Mat, int i)
     364        public double[] getMatrixRow(double[,] Mat, int i)
    362365        {
    363366            double[] tmp = new double[Mat.GetUpperBound(1) + 1];
     
    372375    }
    373376}
    374 
  • branches/ichiriac/HeuristicLab.Algorithms.DifferentialEvolution/HeuristicLab.Algorithms.DifferentialEvolution.csproj

    r13633 r13770  
    2222    <ErrorReport>prompt</ErrorReport>
    2323    <WarningLevel>4</WarningLevel>
     24    <GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
    2425  </PropertyGroup>
    2526  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     
    9596  <ItemGroup>
    9697    <Compile Include="DifferentialEvolution.cs" />
     98    <Compile Include="DifferentialEvolutionReproduction.cs" />
     99    <Compile Include="DifferentialEvolutionSelection.cs" />
    97100    <Compile Include="Plugin.cs" />
    98101    <Compile Include="Properties\AssemblyInfo.cs" />
     102    <Compile Include="Solution.cs" />
    99103  </ItemGroup>
    100104  <ItemGroup>
Note: See TracChangeset for help on using the changeset viewer.