Changeset 15562 for branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASP/GRASPContext.cs
- Timestamp:
- 12/29/17 23:56:43 (7 years ago)
- Location:
- branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASP
- Files:
-
- 1 added
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms/3.3/GRASP/GRASPContext.cs
r15561 r15562 20 20 #endregion 21 21 22 using System;23 using System.Collections.Generic;24 22 using System.Linq; 25 using System.Runtime.CompilerServices;26 using System.Threading;27 23 using HeuristicLab.Common; 28 24 using HeuristicLab.Core; 29 using HeuristicLab.Data;30 using HeuristicLab.Optimization;31 25 using HeuristicLab.Parameters; 32 26 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 33 using HeuristicLab.Random;34 27 35 28 namespace HeuristicLab.Problems.GeneralizedQuadraticAssignment.Algorithms.GRASP { 36 29 [Item("GRASP+PR (GQAP) Context", "Context for GRASP+PR (GQAP).")] 37 30 [StorableClass] 38 public sealed class GRASPContext : ParameterizedNamedItem, IExecutionContext{31 public sealed class GRASPContext : SingleObjectivePopulationContext<ISingleObjectiveSolutionScope<GQAPSolution>> { 39 32 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 57 33 [Storable] 58 34 private IValueParameter<GQAP> problem; … … 60 36 get { return problem.Value; } 61 37 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; }93 38 } 94 39 … … 99 44 set { bestSolution.Value = value; } 100 45 } 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 }108 46 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 }128 47 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()); 133 49 } 134 50 … … 137 53 private GRASPContext(GRASPContext original, Cloner cloner) 138 54 : base(original, cloner) { 139 scope = cloner.Clone(original.scope);140 55 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);145 56 bestSolution = cloner.Clone(original.bestSolution); 146 localSearchEvaluations = cloner.Clone(original.localSearchEvaluations);147 random = cloner.Clone(original.random);148 57 } 149 58 public GRASPContext() : this("GRASP+PR (GQAP) Context") { } 150 59 public GRASPContext(string name) : base(name) { 151 scope = new Scope("Global");152 153 60 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)));158 61 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()));161 62 } 162 63 … … 175 76 return scope; 176 77 } 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 > b207 || !Maximization && a < b;208 }209 210 #region IExecutionContext members211 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 #endregion227 228 #region Engine Helper229 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 #endregion255 78 } 256 79 }
Note: See TracChangeset
for help on using the changeset viewer.