Changeset 3074 for trunk/sources/HeuristicLab.Algorithms.TS/3.3/TS.cs
- Timestamp:
- 03/16/10 21:29:10 (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Algorithms.TS/3.3/TS.cs
r3048 r3074 22 22 using System; 23 23 using System.Collections.Generic; 24 using System.Linq; 24 25 using HeuristicLab.Core; 25 26 using HeuristicLab.Data; … … 33 34 namespace HeuristicLab.Algorithms.TS { 34 35 [Item("TS", "A tabu search algorithm.")] 36 [Creatable("Algorithms")] 35 37 public sealed class TS : EngineAlgorithm { 36 /*#region Parameter Properties 38 #region Problem Properties 39 public override Type ProblemType { 40 get { return typeof(ISingleObjectiveProblem); } 41 } 42 public new ISingleObjectiveProblem Problem { 43 get { return (ISingleObjectiveProblem)base.Problem; } 44 set { base.Problem = value; } 45 } 46 #endregion 47 48 #region Parameter Properties 37 49 private ValueParameter<IntValue> SeedParameter { 38 50 get { return (ValueParameter<IntValue>)Parameters["Seed"]; } … … 43 55 private ConstrainedValueParameter<IMoveGenerator> MoveGeneratorParameter { 44 56 get { return (ConstrainedValueParameter<IMoveGenerator>)Parameters["MoveGenerator"]; } 57 } 58 private ConstrainedValueParameter<IMoveMaker> MoveMakerParameter { 59 get { return (ConstrainedValueParameter<IMoveMaker>)Parameters["MoveMaker"]; } 60 } 61 private ConstrainedValueParameter<ISingleObjectiveMoveEvaluator> MoveEvaluatorParameter { 62 get { return (ConstrainedValueParameter<ISingleObjectiveMoveEvaluator>)Parameters["MoveEvaluator"]; } 63 } 64 private ConstrainedValueParameter<ITabuMoveEvaluator> TabuMoveEvaluatorParameter { 65 get { return (ConstrainedValueParameter<ITabuMoveEvaluator>)Parameters["TabuMoveEvaluator"]; } 66 } 67 private ConstrainedValueParameter<ITabuMoveMaker> TabuMoveMakerParameter { 68 get { return (ConstrainedValueParameter<ITabuMoveMaker>)Parameters["TabuMoveMaker"]; } 69 } 70 private ValueParameter<IntValue> TabuTenureParameter { 71 get { return (ValueParameter<IntValue>)Parameters["TabuTenure"]; } 45 72 } 46 73 private ValueParameter<IntValue> MaximumIterationsParameter { … … 61 88 get { return MoveGeneratorParameter.Value; } 62 89 set { MoveGeneratorParameter.Value = value; } 90 } 91 public IMoveMaker MoveMaker { 92 get { return MoveMakerParameter.Value; } 93 set { MoveMakerParameter.Value = value; } 94 } 95 public ISingleObjectiveMoveEvaluator MoveEvaluator { 96 get { return MoveEvaluatorParameter.Value; } 97 set { MoveEvaluatorParameter.Value = value; } 98 } 99 public ITabuMoveEvaluator TabuMoveEvaluator { 100 get { return TabuMoveEvaluatorParameter.Value; } 101 set { TabuMoveEvaluatorParameter.Value = value; } 102 } 103 public ITabuMoveMaker TabuMoveMaker { 104 get { return TabuMoveMakerParameter.Value; } 105 set { TabuMoveMakerParameter.Value = value; } 106 } 107 public IntValue TabuTenure { 108 get { return TabuTenureParameter.Value; } 109 set { TabuTenureParameter.Value = value; } 63 110 } 64 111 public IntValue MaximumIterations { … … 82 129 Parameters.Add(new ValueParameter<BoolValue>("SetSeedRandomly", "True if the random seed should be set to a random value, otherwise false.", new BoolValue(true))); 83 130 Parameters.Add(new ConstrainedValueParameter<IMoveGenerator>("MoveGenerator", "The operator used to generate moves to the neighborhood of the current solution.")); 131 Parameters.Add(new ConstrainedValueParameter<IMoveMaker>("MoveMaker", "The operator used to perform a move.")); 132 Parameters.Add(new ConstrainedValueParameter<ISingleObjectiveMoveEvaluator>("MoveEvaluator", "The operator used to evaluate a move.")); 133 Parameters.Add(new ConstrainedValueParameter<ITabuMoveEvaluator>("TabuMoveEvaluator", "The operator to evaluate whether a move is tabu or not.")); 134 Parameters.Add(new ConstrainedValueParameter<ITabuMoveMaker>("TabuMoveMaker", "The operator used to insert attributes of a move into the tabu list.")); 135 Parameters.Add(new ValueParameter<IntValue>("TabuTenure", "The length of the tabu list.", new IntValue(10))); 84 136 Parameters.Add(new ValueParameter<IntValue>("MaximumIterations", "The maximum number of generations which should be processed.", new IntValue(1000))); 85 137 … … 100 152 101 153 tsMainLoop.MoveGeneratorParameter.ActualName = MoveGeneratorParameter.Name; 102 tsMainLoop.MoveMakerParameter.ActualName = Move Generator..Name;103 tsMainLoop. ElitesParameter.ActualName = ElitesParameter.Name;104 tsMainLoop. MaximumGenerationsParameter.ActualName = MaximumGenerationsParameter.Name;105 tsMainLoop. MutatorParameter.ActualName = MutatorParameter.Name;106 tsMainLoop.M utationProbabilityParameter.ActualName = MutationProbabilityParameter.Name;154 tsMainLoop.MoveMakerParameter.ActualName = MoveMakerParameter.Name; 155 tsMainLoop.MoveEvaluatorParameter.ActualName = MoveEvaluatorParameter.Name; 156 tsMainLoop.TabuMoveEvaluatorParameter.ActualName = TabuMoveEvaluatorParameter.Name; 157 tsMainLoop.TabuMoveMakerParameter.ActualName = TabuMoveMakerParameter.Name; 158 tsMainLoop.MaximumIterationsParameter.ActualName = MaximumIterationsParameter.Name; 107 159 tsMainLoop.RandomParameter.ActualName = RandomCreator.RandomParameter.ActualName; 108 160 tsMainLoop.ResultsParameter.ActualName = "Results"; 109 161 110 Initialze(); 111 } 162 Initialize(); 163 } 164 112 165 [StorableConstructor] 113 166 private TS(bool deserializing) : base() { } … … 115 168 public override IDeepCloneable Clone(Cloner cloner) { 116 169 TS clone = (TS)base.Clone(cloner); 117 clone.Initial ze();170 clone.Initialize(); 118 171 return clone; 119 172 } … … 124 177 ParameterizeStochasticOperator(Problem.Evaluator); 125 178 foreach (IOperator op in Problem.Operators) ParameterizeStochasticOperator(op); 179 foreach (ISingleObjectiveMoveEvaluator op in Problem.Operators.OfType<ISingleObjectiveMoveEvaluator>()) { 180 op.MoveQualityParameter.ActualNameChanged += new EventHandler(MoveEvaluator_MoveQualityParameter_ActualNameChanged); 181 } 126 182 ParameterizeSolutionsCreator(); 127 Parameterize SGAMainLoop();128 Parameterize Selectors();129 UpdateCrossovers();130 UpdateM utators();183 ParameterizeTSMainLoop(); 184 ParameterizeMoveEvaluator(); 185 ParameterizeMoveMaker(); 186 UpdateMoveGenerator(); 131 187 Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged); 132 188 base.OnProblemChanged(); … … 140 196 ParameterizeStochasticOperator(Problem.Evaluator); 141 197 ParameterizeSolutionsCreator(); 142 ParameterizeSGAMainLoop(); 143 ParameterizeSelectors(); 198 ParameterizeTSMainLoop(); 199 ParameterizeMoveEvaluator(); 200 ParameterizeMoveMaker(); 144 201 Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged); 145 202 base.Problem_EvaluatorChanged(sender, e); … … 147 204 protected override void Problem_OperatorsChanged(object sender, EventArgs e) { 148 205 foreach (IOperator op in Problem.Operators) ParameterizeStochasticOperator(op); 149 UpdateCrossovers(); 150 UpdateMutators(); 206 // This may seem pointless, but some operators already have the eventhandler registered, others don't 207 // FIXME: Is there another way to solve this problem? 208 foreach (ISingleObjectiveMoveEvaluator op in Problem.Operators.OfType<ISingleObjectiveMoveEvaluator>()) { 209 op.MoveQualityParameter.ActualNameChanged -= new EventHandler(MoveEvaluator_MoveQualityParameter_ActualNameChanged); 210 op.MoveQualityParameter.ActualNameChanged += new EventHandler(MoveEvaluator_MoveQualityParameter_ActualNameChanged); 211 } 212 IMoveGenerator oldMoveGenerator = MoveGenerator; 213 UpdateMoveGenerator(); 214 if (oldMoveGenerator == MoveGenerator) // in this case MoveGeneratorParameter_ValueChanged did not fire 215 UpdateMoveParameters(); 216 ParameterizeTSMainLoop(); 217 ParameterizeMoveEvaluator(); 218 ParameterizeMoveMaker(); 151 219 base.Problem_OperatorsChanged(sender, e); 152 220 } 153 private void ElitesParameter_ValueChanged(object sender, EventArgs e) {154 Elites.ValueChanged += new EventHandler(Elites_ValueChanged);155 ParameterizeSelectors();156 }157 private void Elites_ValueChanged(object sender, EventArgs e) {158 ParameterizeSelectors();159 }160 private void PopulationSizeParameter_ValueChanged(object sender, EventArgs e) {161 PopulationSize.ValueChanged += new EventHandler(PopulationSize_ValueChanged);162 ParameterizeSelectors();163 }164 private void PopulationSize_ValueChanged(object sender, EventArgs e) {165 ParameterizeSelectors();166 }167 221 private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) { 168 ParameterizeSGAMainLoop(); 169 ParameterizeSelectors(); 222 ParameterizeTSMainLoop(); 223 ParameterizeMoveEvaluator(); 224 ParameterizeMoveMaker(); 225 } 226 private void MoveGeneratorParameter_ValueChanged(object sender, EventArgs e) { 227 UpdateMoveParameters(); 228 } 229 private void MoveEvaluatorParameter_ValueChanged(object sender, EventArgs e) { 230 ParameterizeTSMainLoop(); 231 ParameterizeMoveEvaluator(); 232 ParameterizeMoveMaker(); 233 } 234 private void MoveEvaluator_MoveQualityParameter_ActualNameChanged(object sender, EventArgs e) { 235 ParameterizeTSMainLoop(); 236 ParameterizeMoveEvaluator(); 237 ParameterizeMoveMaker(); 170 238 } 171 239 #endregion … … 173 241 #region Helpers 174 242 [StorableHook(HookType.AfterDeserialization)] 175 private void Initialze() { 176 InitializeSelectors(); 177 UpdateSelectors(); 178 PopulationSizeParameter.ValueChanged += new EventHandler(PopulationSizeParameter_ValueChanged); 179 PopulationSize.ValueChanged += new EventHandler(PopulationSize_ValueChanged); 180 ElitesParameter.ValueChanged += new EventHandler(ElitesParameter_ValueChanged); 181 Elites.ValueChanged += new EventHandler(Elites_ValueChanged); 182 if (Problem != null) 243 private void Initialize() { 244 if (Problem != null) { 183 245 Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged); 184 } 185 246 foreach (ISingleObjectiveMoveEvaluator op in Problem.Operators.OfType<ISingleObjectiveMoveEvaluator>()) { 247 op.MoveQualityParameter.ActualNameChanged += new EventHandler(MoveEvaluator_MoveQualityParameter_ActualNameChanged); 248 } 249 } 250 MoveGeneratorParameter.ValueChanged += new EventHandler(MoveGeneratorParameter_ValueChanged); 251 MoveEvaluatorParameter.ValueChanged += new EventHandler(MoveEvaluatorParameter_ValueChanged); 252 } 253 private void UpdateMoveGenerator() { 254 IMoveGenerator oldMoveGenerator = MoveGenerator; 255 MoveGeneratorParameter.ValidValues.Clear(); 256 if (Problem != null) { 257 foreach (IMoveGenerator generator in Problem.Operators.OfType<IMoveGenerator>().OrderBy(x => x.Name)) 258 MoveGeneratorParameter.ValidValues.Add(generator); 259 } 260 if (oldMoveGenerator != null && MoveGeneratorParameter.ValidValues.Any(x => x.GetType() == oldMoveGenerator.GetType())) 261 MoveGenerator = MoveGeneratorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMoveGenerator.GetType()); 262 if (MoveGenerator == null) { 263 ClearMoveParameters(); 264 } 265 } 266 private void UpdateMoveParameters() { 267 IMoveMaker oldMoveMaker = MoveMaker; 268 ISingleObjectiveMoveEvaluator oldMoveEvaluator = MoveEvaluator; 269 ITabuMoveEvaluator oldTabuMoveEvaluator = TabuMoveEvaluator; 270 ITabuMoveMaker oldTabuMoveMaker = TabuMoveMaker; 271 ClearMoveParameters(); 272 List<Type> moveTypes = MoveGenerator.GetType().GetInterfaces().Where(x => typeof(IMoveOperator).IsAssignableFrom(x)).ToList(); 273 foreach (Type type in moveTypes.ToList()) { 274 if (moveTypes.Any(t => t != type && type.IsAssignableFrom(t))) 275 moveTypes.Remove(type); 276 } 277 foreach (Type type in moveTypes) { 278 var operators = Problem.Operators.Where(x => type.IsAssignableFrom(x.GetType())).OrderBy(x => x.Name); 279 foreach (IMoveMaker moveMaker in operators.OfType<IMoveMaker>()) 280 MoveMakerParameter.ValidValues.Add(moveMaker); 281 foreach (ISingleObjectiveMoveEvaluator moveEvaluator in operators.OfType<ISingleObjectiveMoveEvaluator>()) 282 MoveEvaluatorParameter.ValidValues.Add(moveEvaluator); 283 foreach (ITabuMoveEvaluator tabuMoveEvaluator in operators.OfType<ITabuMoveEvaluator>()) 284 TabuMoveEvaluatorParameter.ValidValues.Add(tabuMoveEvaluator); 285 foreach (ITabuMoveMaker tabuMoveMaker in operators.OfType<ITabuMoveMaker>()) 286 TabuMoveMakerParameter.ValidValues.Add(tabuMoveMaker); 287 } 288 if (oldMoveMaker != null && MoveMakerParameter.ValidValues.Any(x => x.GetType() == oldMoveMaker.GetType())) 289 MoveMaker = MoveMakerParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMoveMaker.GetType()); 290 if (oldMoveEvaluator != null && MoveEvaluatorParameter.ValidValues.Any(x => x.GetType() == oldMoveEvaluator.GetType())) 291 MoveEvaluator = MoveEvaluatorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMoveEvaluator.GetType()); 292 if (oldTabuMoveMaker != null && TabuMoveMakerParameter.ValidValues.Any(x => x.GetType() == oldTabuMoveMaker.GetType())) 293 TabuMoveMaker = TabuMoveMakerParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldTabuMoveMaker.GetType()); 294 if (oldTabuMoveEvaluator != null && TabuMoveEvaluatorParameter.ValidValues.Any(x => x.GetType() == oldTabuMoveEvaluator.GetType())) 295 TabuMoveEvaluator = TabuMoveEvaluatorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldTabuMoveEvaluator.GetType()); 296 } 297 private void ClearMoveParameters() { 298 MoveMakerParameter.ValidValues.Clear(); 299 MoveEvaluatorParameter.ValidValues.Clear(); 300 TabuMoveEvaluatorParameter.ValidValues.Clear(); 301 TabuMoveMakerParameter.ValidValues.Clear(); 302 } 186 303 private void ParameterizeSolutionsCreator() { 187 304 SolutionsCreator.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name; 188 305 SolutionsCreator.SolutionCreatorParameter.ActualName = Problem.SolutionCreatorParameter.Name; 189 306 } 190 private void ParameterizeSGAMainLoop() { 191 TSMainLoop.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name; 307 private void ParameterizeTSMainLoop() { 192 308 TSMainLoop.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name; 193 309 TSMainLoop.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName; 310 if (MoveEvaluator != null) 311 TSMainLoop.MoveQualityParameter.ActualName = MoveEvaluator.MoveQualityParameter.ActualName; 194 312 } 195 313 private void ParameterizeStochasticOperator(IOperator op) { … … 197 315 ((IStochasticOperator)op).RandomParameter.ActualName = RandomCreator.RandomParameter.ActualName; 198 316 } 199 private void InitializeSelectors() { 200 selectors = new List<ISelector>(); 201 if (ApplicationManager.Manager != null) { 202 selectors.AddRange(ApplicationManager.Manager.GetInstances<ISelector>().Where(x => !(x is IMultiObjectiveSelector)).OrderBy(x => x.Name)); 203 ParameterizeSelectors(); 204 } 205 } 206 private void ParameterizeSelectors() { 207 foreach (ISelector selector in Selectors) { 208 selector.CopySelected = new BoolValue(true); 209 selector.NumberOfSelectedSubScopesParameter.Value = new IntValue(2 * (PopulationSizeParameter.Value.Value - ElitesParameter.Value.Value)); 210 ParameterizeStochasticOperator(selector); 211 } 212 if (Problem != null) { 213 foreach (ISingleObjectiveSelector selector in Selectors.OfType<ISingleObjectiveSelector>()) { 214 selector.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name; 215 selector.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName; 216 } 217 } 218 } 219 private void UpdateSelectors() { 220 if (ApplicationManager.Manager != null) { 221 ISelector oldSelector = SelectorParameter.Value; 222 SelectorParameter.ValidValues.Clear(); 223 foreach (ISelector selector in Selectors.OrderBy(x => x.Name)) 224 SelectorParameter.ValidValues.Add(selector); 225 if (oldSelector != null) 226 SelectorParameter.Value = SelectorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldSelector.GetType()); 227 } 228 } 229 private void UpdateCrossovers() { 230 ICrossover oldCrossover = CrossoverParameter.Value; 231 CrossoverParameter.ValidValues.Clear(); 232 foreach (ICrossover crossover in Problem.Operators.OfType<ICrossover>().OrderBy(x => x.Name)) 233 CrossoverParameter.ValidValues.Add(crossover); 234 if (oldCrossover != null) 235 CrossoverParameter.Value = CrossoverParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldCrossover.GetType()); 236 } 237 private void UpdateMutators() { 238 IManipulator oldMutator = MutatorParameter.Value; 239 MutatorParameter.ValidValues.Clear(); 240 foreach (IManipulator mutator in Problem.Operators.OfType<IManipulator>().OrderBy(x => x.Name)) 241 MutatorParameter.ValidValues.Add(mutator); 242 if (oldMutator != null) 243 MutatorParameter.Value = MutatorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMutator.GetType()); 244 } 245 #endregion 246 */ 317 private void ParameterizeMoveEvaluator() { 318 foreach (ISingleObjectiveMoveEvaluator op in Problem.Operators.OfType<ISingleObjectiveMoveEvaluator>()) { 319 op.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName; 320 } 321 } 322 private void ParameterizeMoveMaker() { 323 foreach (IMoveMaker op in Problem.Operators.OfType<IMoveMaker>()) { 324 op.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName; 325 if (MoveEvaluator != null) 326 op.MoveQualityParameter.ActualName = MoveEvaluator.MoveQualityParameter.ActualName; 327 } 328 } 329 #endregion 247 330 } 248 331 }
Note: See TracChangeset
for help on using the changeset viewer.