Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
12/29/17 23:56:43 (6 years ago)
Author:
abeham
Message:

#1614: added additional algorithms

Location:
branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASP
Files:
1 added
2 moved

Legend:

Unmodified
Added
Removed
  • branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASP/GRASP.cs

    r15561 r15562  
    2323using System.Linq;
    2424using System.Threading;
    25 using HeuristicLab.Analysis;
    2625using HeuristicLab.Common;
    2726using HeuristicLab.Core;
     
    3130using HeuristicLab.Parameters;
    3231using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    33 using HeuristicLab.Random;
    3432
    3533namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms.GRASP {
     
    4139  [Creatable(CreatableAttribute.Categories.PopulationBasedAlgorithms)]
    4240  [StorableClass]
    43   public class GRASP : BasicAlgorithm {
     41  public sealed class GRASP : StochasticAlgorithm<GRASPContext> {
    4442
    4543    public override bool SupportsPause {
     
    5755
    5856    [Storable]
    59     private ValueParameter<IAnalyzer> analyzerParameter;
    60     public IValueParameter<IAnalyzer> AnalyzerParameter {
    61       get { return analyzerParameter; }
    62     }
    63 
    64     [Storable]
    65     private FixedValueParameter<BoolValue> setSeedRandomlyParameter;
    66     private IFixedValueParameter<BoolValue> SetSeedRandomlyParameter {
    67       get { return setSeedRandomlyParameter; }
    68     }
    69     [Storable]
    70     private FixedValueParameter<IntValue> seedParameter;
    71     private IFixedValueParameter<IntValue> SeedParameter {
    72       get { return seedParameter; }
    73     }
    74     [Storable]
    7557    private FixedValueParameter<IntValue> eliteSetSizeParameter;
    7658    private IFixedValueParameter<IntValue> EliteSetSizeParameter {
     
    8365    }
    8466    [Storable]
    85     private FixedValueParameter<IntValue> maximumIterationsParameter;
    86     public IFixedValueParameter<IntValue> MaximumIterationsParameter {
    87       get { return maximumIterationsParameter; }
    88     }
    89     [Storable]
    9067    private FixedValueParameter<IntValue> maximumLocalSearchIterationsParameter;
    9168    public IFixedValueParameter<IntValue> MaximumLocalSearchIterationsParameter {
    92       get { return maximumIterationsParameter; }
     69      get { return maximumLocalSearchIterationsParameter; }
    9370    }
    9471    [Storable]
     
    11390    }
    11491   
    115     public bool SetSeedRandomly {
    116       get { return setSeedRandomlyParameter.Value.Value; }
    117       set { setSeedRandomlyParameter.Value.Value = value; }
    118     }
    119     public int Seed {
    120       get { return seedParameter.Value.Value; }
    121       set { seedParameter.Value.Value = value; }
    122     }
    12392    public int EliteSetSize {
    12493      get { return eliteSetSizeParameter.Value.Value; }
     
    12998      set { minimiumEliteSetSizeParameter.Value.Value = value; }
    13099    }
    131     public int MaximumIterations {
    132       get { return maximumIterationsParameter.Value.Value; }
    133       set { maximumIterationsParameter.Value.Value = value; }
    134     }
    135100    public int MaximumLocalSearchIterations {
    136101      get { return maximumLocalSearchIterationsParameter.Value.Value; }
     
    155120
    156121    [StorableConstructor]
    157     protected GRASP(bool deserializing) : base(deserializing) { }
    158     protected GRASP(GRASP original, Cloner cloner)
     122    private GRASP(bool deserializing) : base(deserializing) { }
     123    private GRASP(GRASP original, Cloner cloner)
    159124      : base(original, cloner) {
    160       setSeedRandomlyParameter = cloner.Clone(original.setSeedRandomlyParameter);
    161       seedParameter = cloner.Clone(original.seedParameter);
    162       analyzerParameter = cloner.Clone(original.analyzerParameter);
    163125      eliteSetSizeParameter = cloner.Clone(original.eliteSetSizeParameter);
    164126      minimiumEliteSetSizeParameter = cloner.Clone(original.minimiumEliteSetSizeParameter);
    165       maximumIterationsParameter = cloner.Clone(original.maximumIterationsParameter);
    166127      maximumLocalSearchIterationsParameter = cloner.Clone(original.maximumLocalSearchIterationsParameter);
    167128      candidateSizeFactorParameter = cloner.Clone(original.candidateSizeFactorParameter);
     
    169130      oneMoveProbabilityParameter = cloner.Clone(original.oneMoveProbabilityParameter);
    170131      minimumDifferenceParameter = cloner.Clone(original.minimumDifferenceParameter);
    171       context = cloner.Clone(original.context);
    172132    }
    173133    public GRASP() {
    174       Parameters.Add(setSeedRandomlyParameter = new FixedValueParameter<BoolValue>("SetSeedRandomly", "Whether to overwrite the seed with a random value each time the algorithm is run.", new BoolValue(true)));
    175       Parameters.Add(seedParameter = new FixedValueParameter<IntValue>("Seed", "The random seed that is used in the stochastic algorithm", new IntValue(0)));
    176       Parameters.Add(analyzerParameter = new ValueParameter<IAnalyzer>("Analyzer", "The analyzers that are used to perform an analysis of the solutions.", new MultiAnalyzer()));
    177134      Parameters.Add(eliteSetSizeParameter = new FixedValueParameter<IntValue>("EliteSetSize", "The (maximum) size of the elite set.", new IntValue(10)));
    178135      Parameters.Add(minimiumEliteSetSizeParameter = new FixedValueParameter<IntValue>("MinimumEliteSetSize", "(ρ) The minimal size of the elite set, before local search and path relinking are applied.", new IntValue(2)));
    179       Parameters.Add(maximumIterationsParameter = new FixedValueParameter<IntValue>("MaximumIterations", "The number of iterations that the algorithm should run.", new IntValue(1000)));
    180136      Parameters.Add(maximumLocalSearchIterationsParameter = new FixedValueParameter<IntValue>("MaximumLocalSearchIteration", "The maximum number of iterations that the approximate local search should run", new IntValue(100)));
    181137      Parameters.Add(candidateSizeFactorParameter = new FixedValueParameter<PercentValue>("CandidateSizeFactor", "(η) Determines the size of the set of feasible moves in each path - relinking step relative to the maximum size.A value of 50 % means that only half of all possible moves are considered each step.", new PercentValue(0.5)));
     
    183139      Parameters.Add(oneMoveProbabilityParameter = new FixedValueParameter<PercentValue>("OneMoveProbability", "The probability for performing a 1-move, which is the opposite of performing a 2-move.", new PercentValue(.5)));
    184140      Parameters.Add(minimumDifferenceParameter = new FixedValueParameter<IntValue>("MinimumDifference", "The minimum amount of difference between two solutions so that they are both accepted in the elite set.", new IntValue(4)));
     141
    185142      Problem = new GQAP();
    186143    }
     
    190147    }
    191148
    192     public override void Prepare() {
    193       base.Prepare();
    194       Results.Clear();
    195       context = null;
    196     }
    197 
    198     [Storable]
    199     private GRASPContext context;
    200 
    201149    protected override void Initialize(CancellationToken cancellationToken) {
    202150      base.Initialize(cancellationToken);
    203       context = new GRASPContext();
    204       context.Problem = Problem;
    205       context.Scope.Variables.Add(new Variable("Results", Results));
    206 
    207       IExecutionContext ctxt = null;
    208       foreach (var item in Problem.ExecutionContextItems)
    209         ctxt = new Core.ExecutionContext(ctxt, item, context.Scope);
    210       ctxt = new Core.ExecutionContext(ctxt, this, context.Scope);
    211       context.Parent = ctxt;
    212 
    213       if (SetSeedRandomly) {
    214         var rnd = new System.Random();
    215         Seed = rnd.Next();
    216       }
    217       context.Random = new MersenneTwister((uint)Seed);
    218       context.Iterations = 0;
    219       context.EvaluatedSolutions = 0;
    220       context.BestQuality = double.NaN;
    221       context.BestSolution = null;
    222 
    223       context.Initialized = true;
    224 
    225       Results.Add(new Result("Iterations", new IntValue(context.Iterations)));
    226       Results.Add(new Result("EvaluatedSolutions", new IntValue(context.EvaluatedSolutions)));
    227       Results.Add(new Result("BestQuality", new DoubleValue(context.BestQuality)));
     151
     152      Context.Problem = Problem;     
     153      Context.BestQuality = double.NaN;
     154      Context.BestSolution = null;
     155
     156      Results.Add(new Result("Iterations", new IntValue(Context.Iterations)));
     157      Results.Add(new Result("EvaluatedSolutions", new IntValue(Context.EvaluatedSolutions)));
     158      Results.Add(new Result("BestQuality", new DoubleValue(Context.BestQuality)));
    228159      Results.Add(new Result("BestSolution", typeof(GQAPSolution)));
    229160
    230       context.RunOperator(analyzerParameter.Value, context.Scope, cancellationToken);
     161      Context.RunOperator(Analyzer, Context.Scope, cancellationToken);
    231162    }
    232163
     
    235166      while (!StoppingCriterion()) { // line 2 in Algorithm 1
    236167        // next: line 3 in Algorithm 1
    237         var pi_prime_vec = GreedyRandomizedSolutionCreator.CreateSolution(context.Random, Problem.ProblemInstance, 1000, false, cancellationToken);
    238         if (context.PopulationCount >= MinimumEliteSetSize) { // line 4 in Algorithm 1
     168        var pi_prime_vec = GreedyRandomizedSolutionCreator.CreateSolution(Context.Random, Problem.ProblemInstance, 1000, false, cancellationToken);
     169        if (Context.PopulationCount >= MinimumEliteSetSize) { // line 4 in Algorithm 1
    239170          GQAPSolution pi_prime;
    240171          if (!Problem.ProblemInstance.IsFeasible(pi_prime_vec)) // line 5 in Algorithm 1
    241             pi_prime = context.AtPopulation(context.Random.Next(context.PopulationCount)).Solution; // line 6 in Algorithm 1
     172            pi_prime = Context.AtPopulation(Context.Random.Next(Context.PopulationCount)).Solution; // line 6 in Algorithm 1
    242173          else {
    243174            // This is necessary, because pi_prime has not been evaluated yet and such details are not covered in Algorithm 1
    244175            pi_prime = Problem.ProblemInstance.ToEvaluatedSolution(pi_prime_vec);
    245             context.EvaluatedSolutions++;
     176            Context.EvaluatedSolutions++;
    246177          }
    247178
    248179          ApproxLocalSearch(pi_prime); // line 8 in Algorithm 1
    249           var pi_plus = context.AtPopulation(context.Random.Next(context.PopulationCount)); // line 9 in Algorithm 1
     180          var pi_plus = Context.AtPopulation(Context.Random.Next(Context.PopulationCount)); // line 9 in Algorithm 1
    250181          pi_prime = PathRelinking(pi_prime, pi_plus.Solution); // line 10 in Algorithm 1
    251182          ApproxLocalSearch(pi_prime); // line 11 in Algorithm 1
    252183          var fitness = Problem.ProblemInstance.ToSingleObjective(pi_prime.Evaluation);
    253184          // Book-keeping
    254           if (context.BestQuality > fitness) {
    255             context.BestQuality = fitness;
    256             context.BestSolution = (GQAPSolution)pi_prime.Clone();
    257           }
    258 
    259           if (context.PopulationCount == EliteSetSize) { // line 12 in Algorithm 1
     185          if (Context.BestQuality > fitness) {
     186            Context.BestQuality = fitness;
     187            Context.BestSolution = (GQAPSolution)pi_prime.Clone();
     188          }
     189
     190          if (Context.PopulationCount == EliteSetSize) { // line 12 in Algorithm 1
    260191            var fit = Problem.ProblemInstance.ToSingleObjective(pi_prime.Evaluation);
    261             double[] similarities = context.Population.Select(x => HammingSimilarityCalculator.CalculateSimilarity(x.Solution.Assignment, pi_prime.Assignment)).ToArray();
     192            double[] similarities = Context.Population.Select(x => HammingSimilarityCalculator.CalculateSimilarity(x.Solution.Assignment, pi_prime.Assignment)).ToArray();
    262193            if (similarities.Max() <= 1.0 - (MinimumDifference / (double)pi_prime.Assignment.Length)) { // cond. 2 of line 13 in Algorithm 1
    263               var replacement = context.Population.Select((v, i) => new { V = v, Index = i })
     194              var replacement = Context.Population.Select((v, i) => new { V = v, Index = i })
    264195                                          .Where(x => x.V.Fitness >= fit).ToArray();
    265196              if (replacement.Length > 0) { // cond. 1 of line 13 in Algorithm 1
    266197                // next two lines: line 14 in Algorithm 1
    267198                replacement = replacement.OrderBy(x => similarities[x.Index]).ToArray();
    268                 context.ReplaceAtPopulation(replacement.Last().Index, context.ToScope(pi_prime, fit));
     199                Context.ReplaceAtPopulation(replacement.Last().Index, Context.ToScope(pi_prime, fit));
    269200              }
    270201            }
    271202          } else if (IsSufficientlyDifferent(pi_prime.Assignment)) { // line 17 in Algorithm 1
    272             context.AddToPopulation(context.ToScope(pi_prime, Problem.ProblemInstance.ToSingleObjective(pi_prime.Evaluation))); // line 18 in Algorithm 1
     203            Context.AddToPopulation(Context.ToScope(pi_prime, Problem.ProblemInstance.ToSingleObjective(pi_prime.Evaluation))); // line 18 in Algorithm 1
    273204          }
    274205        } else if (Problem.ProblemInstance.IsFeasible(pi_prime_vec) /* cond. 1 of line 21 in Algorithm 1 */
    275206          && IsSufficientlyDifferent(pi_prime_vec))  /* cond. 2 of line 21 in Algorithm 1 */ {
    276207          var pi_prime = Problem.ProblemInstance.ToEvaluatedSolution(pi_prime_vec);
    277           context.EvaluatedSolutions++;
     208          Context.EvaluatedSolutions++;
    278209          var fitness = Problem.ProblemInstance.ToSingleObjective(pi_prime.Evaluation);
    279           context.AddToPopulation(context.ToScope(pi_prime, fitness)); /* line 22 in Algorithm 1 */
     210          Context.AddToPopulation(Context.ToScope(pi_prime, fitness)); /* line 22 in Algorithm 1 */
    280211          // Book-keeping
    281           if (context.PopulationCount == 1 || context.BestQuality > fitness) {
    282             context.BestQuality = fitness;
    283             context.BestSolution = (GQAPSolution)pi_prime.Clone();
     212          if (Context.PopulationCount == 1 || Context.BestQuality > fitness) {
     213            Context.BestQuality = fitness;
     214            Context.BestSolution = (GQAPSolution)pi_prime.Clone();
    284215          }
    285216        }
     
    287218        IResult result;
    288219        if (Results.TryGetValue("Iterations", out result))
    289           ((IntValue)result.Value).Value = context.Iterations;
    290         else Results.Add(new Result("Iterations", new IntValue(context.Iterations)));
     220          ((IntValue)result.Value).Value = Context.Iterations;
     221        else Results.Add(new Result("Iterations", new IntValue(Context.Iterations)));
    291222        if (Results.TryGetValue("EvaluatedSolutions", out result))
    292           ((IntValue)result.Value).Value = context.EvaluatedSolutions;
    293         else Results.Add(new Result("EvaluatedSolutions", new IntValue(context.EvaluatedSolutions)));
     223          ((IntValue)result.Value).Value = Context.EvaluatedSolutions;
     224        else Results.Add(new Result("EvaluatedSolutions", new IntValue(Context.EvaluatedSolutions)));
    294225        if (Results.TryGetValue("BestQuality", out result))
    295           ((DoubleValue)result.Value).Value = context.BestQuality;
    296         else Results.Add(new Result("BestQuality", new DoubleValue(context.BestQuality)));
     226          ((DoubleValue)result.Value).Value = Context.BestQuality;
     227        else Results.Add(new Result("BestQuality", new DoubleValue(Context.BestQuality)));
    297228        if (Results.TryGetValue("BestSolution", out result))
    298           result.Value = context.BestSolution;
    299         else Results.Add(new Result("BestSolution", context.BestSolution));
    300 
    301         context.RunOperator(analyzerParameter.Value, context.Scope, cancellationToken);
    302 
    303         context.Iterations++;
     229          result.Value = Context.BestSolution;
     230        else Results.Add(new Result("BestSolution", Context.BestSolution));
     231
     232        Context.RunOperator(Analyzer, Context.Scope, cancellationToken);
     233
     234        Context.Iterations++;
     235        if (cancellationToken.IsCancellationRequested) break;
    304236      }
    305237    }
    306238
    307239    private bool IsSufficientlyDifferent(IntegerVector vec) {
    308       return context.Population.All(x =>
     240      return Context.Population.All(x =>
    309241        HammingSimilarityCalculator.CalculateSimilarity(vec, x.Solution.Assignment) <= 1.0 - (MinimumDifference / (double)vec.Length)
    310242      );
     
    327259      int evaluatedSolutions;
    328260      // lines 2-36 of Algorithm 4 are implemented in the following call
    329       var pi_star = GQAPPathRelinking.Apply(context.Random, source, sourceEval,
     261      var pi_star = GQAPPathRelinking.Apply(Context.Random, source, sourceEval,
    330262        target, targetEval, Problem.ProblemInstance, CandidateSizeFactor,
    331263        out evaluatedSolutions);
    332       context.EvaluatedSolutions += evaluatedSolutions;
     264      Context.EvaluatedSolutions += evaluatedSolutions;
    333265      return pi_star;
    334266    }
     
    336268    private void ApproxLocalSearch(GQAPSolution pi_prime) {
    337269      var localSearchEvaluations = 0;
    338       ApproximateLocalSearch.Apply(context.Random, pi_prime, MaximumCandidateListSize,
     270      ApproximateLocalSearch.Apply(Context.Random, pi_prime, MaximumCandidateListSize,
    339271        OneMoveProbability, MaximumLocalSearchIterations, Problem.ProblemInstance, out localSearchEvaluations);
    340       context.EvaluatedSolutions += localSearchEvaluations;
    341     }
    342 
    343     private bool StoppingCriterion() {
    344       return context.Iterations > MaximumIterations;
     272      Context.EvaluatedSolutions += localSearchEvaluations;
    345273    }
    346274  }
  • branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASP/GRASPContext.cs

    r15561 r15562  
    2020#endregion
    2121
    22 using System;
    23 using System.Collections.Generic;
    2422using System.Linq;
    25 using System.Runtime.CompilerServices;
    26 using System.Threading;
    2723using HeuristicLab.Common;
    2824using HeuristicLab.Core;
    29 using HeuristicLab.Data;
    30 using HeuristicLab.Optimization;
    3125using HeuristicLab.Parameters;
    3226using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    33 using HeuristicLab.Random;
    3427
    3528namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms.GRASP {
    3629  [Item("GRASP+PR (GQAP) Context", "Context for GRASP+PR (GQAP).")]
    3730  [StorableClass]
    38   public sealed class GRASPContext : ParameterizedNamedItem, IExecutionContext {
     31  public sealed class GRASPContext : SingleObjectivePopulationContext<ISingleObjectiveSolutionScope<GQAPSolution>> {
    3932   
    40     private IExecutionContext parent;
    41     public IExecutionContext Parent {
    42       get { return parent; }
    43       set { parent = value; }
    44     }
    45 
    46     [Storable]
    47     private IScope scope;
    48     public IScope Scope {
    49       get { return scope; }
    50       private set { scope = value; }
    51     }
    52 
    53     IKeyedItemCollection<string, IParameter> IExecutionContext.Parameters {
    54       get { return Parameters; }
    55     }
    56 
    5733    [Storable]
    5834    private IValueParameter<GQAP> problem;
     
    6036      get { return problem.Value; }
    6137      set { problem.Value = value; }
    62     }
    63     public bool Maximization {
    64       get { return Problem.Maximization; }
    65     }
    66 
    67     [Storable]
    68     private IValueParameter<BoolValue> initialized;
    69     public bool Initialized {
    70       get { return initialized.Value.Value; }
    71       set { initialized.Value.Value = value; }
    72     }
    73 
    74     [Storable]
    75     private IValueParameter<IntValue> iterations;
    76     public int Iterations {
    77       get { return iterations.Value.Value; }
    78       set { iterations.Value.Value = value; }
    79     }
    80 
    81     [Storable]
    82     private IValueParameter<IntValue> evaluatedSolutions;
    83     public int EvaluatedSolutions {
    84       get { return evaluatedSolutions.Value.Value; }
    85       set { evaluatedSolutions.Value.Value = value; }
    86     }
    87 
    88     [Storable]
    89     private IValueParameter<DoubleValue> bestQuality;
    90     public double BestQuality {
    91       get { return bestQuality.Value.Value; }
    92       set { bestQuality.Value.Value = value; }
    9338    }
    9439
     
    9944      set { bestSolution.Value = value; }
    10045    }
    101 
    102     [Storable]
    103     private IValueParameter<IntValue> localSearchEvaluations;
    104     public int LocalSearchEvaluations {
    105       get { return localSearchEvaluations.Value.Value; }
    106       set { localSearchEvaluations.Value.Value = value; }
    107     }
    10846   
    109     [Storable]
    110     private IValueParameter<IRandom> random;
    111     public IRandom Random {
    112       get { return random.Value; }
    113       set { random.Value = value; }
    114     }
    115 
    116     public IEnumerable<ISingleObjectiveSolutionScope<GQAPSolution>> Population {
    117       get { return scope.SubScopes.OfType<ISingleObjectiveSolutionScope<GQAPSolution>>(); }
    118     }
    119     public void AddToPopulation(ISingleObjectiveSolutionScope<GQAPSolution> solScope) {
    120       scope.SubScopes.Add(solScope);
    121     }
    122     public void ReplaceAtPopulation(int index, ISingleObjectiveSolutionScope<GQAPSolution> solScope) {
    123       scope.SubScopes[index] = solScope;
    124     }
    125     public ISingleObjectiveSolutionScope<GQAPSolution> AtPopulation(int index) {
    126       return scope.SubScopes[index] as ISingleObjectiveSolutionScope<GQAPSolution>;
    127     }
    12847    public void SortPopulation() {
    129       scope.SubScopes.Replace(scope.SubScopes.OfType<ISingleObjectiveSolutionScope<GQAPSolution>>().OrderBy(x => Maximization ? -x.Fitness : x.Fitness).ToList());
    130     }
    131     public int PopulationCount {
    132       get { return scope.SubScopes.Count; }
     48      Scope.SubScopes.Replace(Scope.SubScopes.OfType<ISingleObjectiveSolutionScope<GQAPSolution>>().OrderBy(x => Problem.Maximization ? -x.Fitness : x.Fitness).ToList());
    13349    }
    13450   
     
    13753    private GRASPContext(GRASPContext original, Cloner cloner)
    13854      : base(original, cloner) {
    139       scope = cloner.Clone(original.scope);
    14055      problem = cloner.Clone(original.problem);
    141       initialized = cloner.Clone(original.initialized);
    142       iterations = cloner.Clone(original.iterations);
    143       evaluatedSolutions = cloner.Clone(original.evaluatedSolutions);
    144       bestQuality = cloner.Clone(original.bestQuality);
    14556      bestSolution = cloner.Clone(original.bestSolution);
    146       localSearchEvaluations = cloner.Clone(original.localSearchEvaluations);
    147       random = cloner.Clone(original.random);
    14857    }
    14958    public GRASPContext() : this("GRASP+PR (GQAP) Context") { }
    15059    public GRASPContext(string name) : base(name) {
    151       scope = new Scope("Global");
    152 
    15360      Parameters.Add(problem = new ValueParameter<GQAP>("Problem"));
    154       Parameters.Add(initialized = new ValueParameter<BoolValue>("Initialized", new BoolValue(false)));
    155       Parameters.Add(iterations = new ValueParameter<IntValue>("Iterations", new IntValue(0)));
    156       Parameters.Add(evaluatedSolutions = new ValueParameter<IntValue>("EvaluatedSolutions", new IntValue(0)));
    157       Parameters.Add(bestQuality = new ValueParameter<DoubleValue>("BestQuality", new DoubleValue(double.NaN)));
    15861      Parameters.Add(bestSolution = new ValueParameter<GQAPSolution>("BestFoundSolution"));
    159       Parameters.Add(localSearchEvaluations = new ValueParameter<IntValue>("LocalSearchEvaluations", new IntValue(0)));
    160       Parameters.Add(random = new ValueParameter<IRandom>("Random", new MersenneTwister()));
    16162    }
    16263
     
    17576      return scope;
    17677    }
    177 
    178     public void IncrementEvaluatedSolutions(int byEvaluations) {
    179       if (byEvaluations < 0) throw new ArgumentException("Can only increment and not decrement evaluated solutions.");
    180       EvaluatedSolutions += byEvaluations;
    181     }
    182    
    183     private static void ExecuteAlgorithm(IAlgorithm algorithm) {
    184       using (var evt = new AutoResetEvent(false)) {
    185         EventHandler exeStateChanged = (o, args) => {
    186           if (algorithm.ExecutionState != ExecutionState.Started)
    187             evt.Set();
    188         };
    189         algorithm.ExecutionStateChanged += exeStateChanged;
    190         if (algorithm.ExecutionState != ExecutionState.Prepared) {
    191           algorithm.Prepare(true);
    192           evt.WaitOne();
    193         }
    194         algorithm.Start();
    195         evt.WaitOne();
    196         algorithm.ExecutionStateChanged -= exeStateChanged;
    197       }
    198     }
    199     [MethodImpl(MethodImplOptions.AggressiveInlining)]
    200     public bool IsBetter(ISingleObjectiveSolutionScope<GQAPSolution> a, ISingleObjectiveSolutionScope<GQAPSolution> b) {
    201       return IsBetter(a.Fitness, b.Fitness);
    202     }
    203     [MethodImpl(MethodImplOptions.AggressiveInlining)]
    204     public bool IsBetter(double a, double b) {
    205       return double.IsNaN(b) && !double.IsNaN(a)
    206         || Maximization && a > b
    207         || !Maximization && a < b;
    208     }
    209 
    210     #region IExecutionContext members
    211     public IAtomicOperation CreateOperation(IOperator op) {
    212       return new Core.ExecutionContext(this, op, Scope);
    213     }
    214 
    215     public IAtomicOperation CreateOperation(IOperator op, IScope s) {
    216       return new Core.ExecutionContext(this, op, s);
    217     }
    218 
    219     public IAtomicOperation CreateChildOperation(IOperator op) {
    220       return new Core.ExecutionContext(this, op, Scope);
    221     }
    222 
    223     public IAtomicOperation CreateChildOperation(IOperator op, IScope s) {
    224       return new Core.ExecutionContext(this, op, s);
    225     }
    226     #endregion
    227 
    228     #region Engine Helper
    229     public void RunOperator(IOperator op, IScope scope, CancellationToken cancellationToken) {
    230       var stack = new Stack<IOperation>();
    231       stack.Push(CreateChildOperation(op, scope));
    232 
    233       while (stack.Count > 0) {
    234         cancellationToken.ThrowIfCancellationRequested();
    235 
    236         var next = stack.Pop();
    237         if (next is OperationCollection) {
    238           var coll = (OperationCollection)next;
    239           for (int i = coll.Count - 1; i >= 0; i--)
    240             if (coll[i] != null) stack.Push(coll[i]);
    241         } else if (next is IAtomicOperation) {
    242           var operation = (IAtomicOperation)next;
    243           try {
    244             next = operation.Operator.Execute((IExecutionContext)operation, cancellationToken);
    245           } catch (Exception ex) {
    246             stack.Push(operation);
    247             if (ex is OperationCanceledException) throw ex;
    248             else throw new OperatorExecutionException(operation.Operator, ex);
    249           }
    250           if (next != null) stack.Push(next);
    251         }
    252       }
    253     }
    254     #endregion
    25578  }
    25679}
Note: See TracChangeset for help on using the changeset viewer.