Changeset 2986
- Timestamp:
- 03/10/10 03:37:36 (15 years ago)
- Location:
- trunk/sources
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Algorithms.SGA/3.3/SGA.cs
r2975 r2986 21 21 22 22 using System; 23 using System.Collections.Generic; 23 24 using System.Linq; 24 25 using HeuristicLab.Core; … … 37 38 [Item("SGA", "A standard genetic algorithm.")] 38 39 [Creatable("Algorithms")] 40 [EmptyStorableClass] 39 41 public sealed class SGA : EngineAlgorithm { 40 //#region Private Members 41 //// store operator references in order to be able to access them easily after deserialization 42 //[Storable] 43 //private PopulationCreator populationCreator; 44 //[Storable] 45 //private SGAOperator sgaOperator; 46 //#endregion 47 48 //#region Problem Properties 49 //public override Type ProblemType { 50 // get { return typeof(ISingleObjectiveProblem); } 51 //} 52 //public new ISingleObjectiveProblem Problem { 53 // get { return (ISingleObjectiveProblem)base.Problem; } 54 // set { base.Problem = value; } 55 //} 56 //#endregion 57 58 //#region Parameter Properties 59 //private ValueParameter<IntData> SeedParameter { 60 // get { return (ValueParameter<IntData>)Parameters["Seed"]; } 61 //} 62 //private ValueParameter<BoolData> SetSeedRandomlyParameter { 63 // get { return (ValueParameter<BoolData>)Parameters["SetSeedRandomly"]; } 64 //} 65 //private ValueParameter<IntData> PopulationSizeParameter { 66 // get { return (ValueParameter<IntData>)Parameters["PopulationSize"]; } 67 //} 68 //private ConstrainedValueParameter<ISelector> SelectorParameter { 69 // get { return (ConstrainedValueParameter<ISelector>)Parameters["Selector"]; } 70 //} 71 //private ConstrainedValueParameter<ICrossover> CrossoverParameter { 72 // get { return (ConstrainedValueParameter<ICrossover>)Parameters["Crossover"]; } 73 //} 74 //private ValueParameter<DoubleData> MutationProbabilityParameter { 75 // get { return (ValueParameter<DoubleData>)Parameters["MutationProbability"]; } 76 //} 77 //private OptionalConstrainedValueParameter<IManipulator> MutatorParameter { 78 // get { return (OptionalConstrainedValueParameter<IManipulator>)Parameters["Mutator"]; } 79 //} 80 //private ValueParameter<IntData> ElitesParameter { 81 // get { return (ValueParameter<IntData>)Parameters["Elites"]; } 82 //} 83 //private ValueParameter<IntData> MaximumGenerationsParameter { 84 // get { return (ValueParameter<IntData>)Parameters["MaximumGenerations"]; } 85 //} 86 //#endregion 87 88 //#region Properties 89 //public IntData Seed { 90 // get { return SeedParameter.Value; } 91 // set { SeedParameter.Value = value; } 92 //} 93 //public BoolData SetSeedRandomly { 94 // get { return SetSeedRandomlyParameter.Value; } 95 // set { SetSeedRandomlyParameter.Value = value; } 96 //} 97 //public IntData PopulationSize { 98 // get { return PopulationSizeParameter.Value; } 99 // set { PopulationSizeParameter.Value = value; } 100 //} 101 //public ISelector Selector { 102 // get { return SelectorParameter.Value; } 103 // set { SelectorParameter.Value = value; } 104 //} 105 //public ICrossover Crossover { 106 // get { return CrossoverParameter.Value; } 107 // set { CrossoverParameter.Value = value; } 108 //} 109 //public DoubleData MutationProbability { 110 // get { return MutationProbabilityParameter.Value; } 111 // set { MutationProbabilityParameter.Value = value; } 112 //} 113 //public IManipulator Mutator { 114 // get { return MutatorParameter.Value; } 115 // set { MutatorParameter.Value = value; } 116 //} 117 //public IntData Elites { 118 // get { return ElitesParameter.Value; } 119 // set { ElitesParameter.Value = value; } 120 //} 121 //public IntData MaximumGenerations { 122 // get { return MaximumGenerationsParameter.Value; } 123 // set { MaximumGenerationsParameter.Value = value; } 124 //} 125 //#endregion 126 127 //#region Persistence Properties 128 //[Storable] 129 //private object RestoreEvents { 130 // get { return null; } 131 // set { RegisterEvents(); } 132 //} 133 //#endregion 134 135 //public SGA() 136 // : base() { 137 // Parameters.Add(new ValueParameter<IntData>("Seed", "The random seed used to initialize the new pseudo random number generator.", new IntData(0))); 138 // Parameters.Add(new ValueParameter<BoolData>("SetSeedRandomly", "True if the random seed should be set to a random value, otherwise false.", new BoolData(true))); 139 // Parameters.Add(new ValueParameter<IntData>("PopulationSize", "The size of the population of solutions.", new IntData(100))); 140 // Parameters.Add(new ConstrainedValueParameter<ISelector>("Selector", "The operator used to select solutions for reproduction.")); 141 // Parameters.Add(new ConstrainedValueParameter<ICrossover>("Crossover", "The operator used to cross solutions.")); 142 // Parameters.Add(new ValueParameter<DoubleData>("MutationProbability", "The probability that the mutation operator is applied on a solution.", new DoubleData(0.05))); 143 // Parameters.Add(new OptionalConstrainedValueParameter<IManipulator>("Mutator", "The operator used to mutate solutions.")); 144 // Parameters.Add(new ValueParameter<IntData>("Elites", "The numer of elite solutions which are kept in each generation.", new IntData(1))); 145 // Parameters.Add(new ValueParameter<IntData>("MaximumGenerations", "The maximum number of generations which should be processed.", new IntData(1000))); 146 147 // RandomCreator randomCreator = new RandomCreator(); 148 // populationCreator = new PopulationCreator(); 149 // sgaOperator = new SGAOperator(); 150 151 // randomCreator.RandomParameter.ActualName = "Random"; 152 // randomCreator.SeedParameter.ActualName = "Seed"; 153 // randomCreator.SeedParameter.Value = null; 154 // randomCreator.SetSeedRandomlyParameter.ActualName = "SetSeedRandomly"; 155 // randomCreator.SetSeedRandomlyParameter.Value = null; 156 // randomCreator.Successor = populationCreator; 157 158 // populationCreator.PopulationSizeParameter.ActualName = "PopulationSize"; 159 // populationCreator.PopulationSizeParameter.Value = null; 160 // populationCreator.Successor = sgaOperator; 161 162 // sgaOperator.SelectorParameter.ActualName = "Selector"; 163 // sgaOperator.CrossoverParameter.ActualName = "Crossover"; 164 // sgaOperator.ElitesParameter.ActualName = "Elites"; 165 // sgaOperator.MaximumGenerationsParameter.ActualName = "MaximumGenerations"; 166 // sgaOperator.MutatorParameter.ActualName = "Mutator"; 167 // sgaOperator.MutationProbabilityParameter.ActualName = "MutationProbability"; 168 // sgaOperator.RandomParameter.ActualName = "Random"; 169 // sgaOperator.ResultsParameter.ActualName = "Results"; 170 171 // OperatorGraph.InitialOperator = randomCreator; 172 173 // if (ApplicationManager.Manager != null) { 174 // var selectors = ApplicationManager.Manager.GetInstances<ISelector>().Where(x => !(x is IMultiObjectiveSelector)).OrderBy(x => x.Name); 175 // foreach (ISelector selector in selectors) 176 // SelectorParameter.ValidValues.Add(selector); 177 // ParameterizeSelectors(); 178 // } 179 180 // RegisterEvents(); 181 //} 182 183 //public override IDeepCloneable Clone(Cloner cloner) { 184 // SGA clone = (SGA)base.Clone(cloner); 185 // clone.populationCreator = (PopulationCreator)cloner.Clone(populationCreator); 186 // clone.sgaOperator = (SGAOperator)cloner.Clone(sgaOperator); 187 // clone.RegisterEvents(); 188 // return clone; 189 //} 190 191 //#region Events 192 //protected override void OnProblemChanged() { 193 // if (Problem.SolutionCreator is IStochasticOperator) ((IStochasticOperator)Problem.SolutionCreator).RandomParameter.ActualName = "Random"; 194 // if (Problem.Evaluator is IStochasticOperator) ((IStochasticOperator)Problem.Evaluator).RandomParameter.ActualName = "Random"; 195 // foreach (IStochasticOperator op in Problem.Operators.OfType<IStochasticOperator>()) 196 // op.RandomParameter.ActualName = "Random"; 197 198 // populationCreator.SolutionCreatorParameter.Value = Problem.SolutionCreator; 199 // populationCreator.EvaluatorParameter.Value = Problem.Evaluator; 200 // sgaOperator.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name; 201 // sgaOperator.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName; 202 // sgaOperator.EvaluatorParameter.Value = Problem.Evaluator; 203 204 // foreach (ISingleObjectiveSelector op in SelectorParameter.ValidValues.OfType<ISingleObjectiveSelector>()) { 205 // op.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name; 206 // op.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName; 207 // } 208 209 // ICrossover oldCrossover = CrossoverParameter.Value; 210 // CrossoverParameter.ValidValues.Clear(); 211 // foreach (ICrossover crossover in Problem.Operators.OfType<ICrossover>().OrderBy(x => x.Name)) 212 // CrossoverParameter.ValidValues.Add(crossover); 213 // if (oldCrossover != null) { 214 // CrossoverParameter.Value = CrossoverParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldCrossover.GetType()); 215 // } 216 217 // IManipulator oldMutator = MutatorParameter.Value; 218 // MutatorParameter.ValidValues.Clear(); 219 // foreach (IManipulator mutator in Problem.Operators.OfType<IManipulator>().OrderBy(x => x.Name)) 220 // MutatorParameter.ValidValues.Add(mutator); 221 // if (oldMutator != null) { 222 // MutatorParameter.Value = MutatorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMutator.GetType()); 223 // } 224 225 // base.OnProblemChanged(); 226 //} 227 //protected override void Problem_SolutionCreatorChanged(object sender, EventArgs e) { 228 // if (Problem.SolutionCreator is IStochasticOperator) ((IStochasticOperator)Problem.SolutionCreator).RandomParameter.ActualName = "Random"; 229 // populationCreator.SolutionCreatorParameter.Value = Problem.SolutionCreator; 230 // base.Problem_SolutionCreatorChanged(sender, e); 231 //} 232 //protected override void Problem_EvaluatorChanged(object sender, EventArgs e) { 233 // if (Problem.Evaluator is IStochasticOperator) ((IStochasticOperator)Problem.Evaluator).RandomParameter.ActualName = "Random"; 234 235 // foreach (ISingleObjectiveSelector op in SelectorParameter.ValidValues.OfType<ISingleObjectiveSelector>()) { 236 // op.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName; 237 // } 238 239 // populationCreator.EvaluatorParameter.Value = Problem.Evaluator; 240 // sgaOperator.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName; 241 // sgaOperator.EvaluatorParameter.Value = Problem.Evaluator; 242 // base.Problem_EvaluatorChanged(sender, e); 243 //} 244 //private void ElitesParameter_ValueChanged(object sender, EventArgs e) { 245 // foreach (ISelector selector in SelectorParameter.ValidValues) 246 // selector.NumberOfSelectedSubScopesParameter.Value = new IntData(2 * (PopulationSizeParameter.Value.Value - ElitesParameter.Value.Value)); 247 //} 248 //private void PopulationSizeParameter_ValueChanged(object sender, EventArgs e) { 249 // foreach (ISelector selector in SelectorParameter.ValidValues) 250 // selector.NumberOfSelectedSubScopesParameter.Value = new IntData(2 * (PopulationSizeParameter.Value.Value - ElitesParameter.Value.Value)); 251 //} 252 //#endregion 253 254 //#region Helpers 255 //private void RegisterEvents() { 256 // PopulationSizeParameter.ValueChanged += new EventHandler(PopulationSizeParameter_ValueChanged); 257 // ElitesParameter.ValueChanged += new EventHandler(ElitesParameter_ValueChanged); 258 //} 259 //private void ParameterizeSelectors() { 260 // foreach (ISelector selector in SelectorParameter.ValidValues) { 261 // selector.CopySelected = new BoolData(true); 262 // selector.NumberOfSelectedSubScopesParameter.Value = new IntData(2 * (PopulationSizeParameter.Value.Value - ElitesParameter.Value.Value)); 263 // if (selector is IStochasticOperator) ((IStochasticOperator)selector).RandomParameter.ActualName = "Random"; 264 // } 265 //} 266 //private void ParameterizePopulationCreator() { 267 // populationCreator.SolutionCreatorParameter.ActualName = Problem.SolutionCreatorParameter.Name; 268 // populationCreator.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name; 269 //} 270 //private void ParameterizeSGAOperator() { 271 // sgaOperator.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name; 272 // sgaOperator.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName; 273 // sgaOperator.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name; 274 //} 275 //private void ParameterizeSolutionCreator() { 276 //} 277 //#endregion 42 #region Problem Properties 43 public override Type ProblemType { 44 get { return typeof(ISingleObjectiveProblem); } 45 } 46 public new ISingleObjectiveProblem Problem { 47 get { return (ISingleObjectiveProblem)base.Problem; } 48 set { base.Problem = value; } 49 } 50 #endregion 51 52 #region Parameter Properties 53 private ValueParameter<IntData> SeedParameter { 54 get { return (ValueParameter<IntData>)Parameters["Seed"]; } 55 } 56 private ValueParameter<BoolData> SetSeedRandomlyParameter { 57 get { return (ValueParameter<BoolData>)Parameters["SetSeedRandomly"]; } 58 } 59 private ValueParameter<IntData> PopulationSizeParameter { 60 get { return (ValueParameter<IntData>)Parameters["PopulationSize"]; } 61 } 62 private ConstrainedValueParameter<ISelector> SelectorParameter { 63 get { return (ConstrainedValueParameter<ISelector>)Parameters["Selector"]; } 64 } 65 private ConstrainedValueParameter<ICrossover> CrossoverParameter { 66 get { return (ConstrainedValueParameter<ICrossover>)Parameters["Crossover"]; } 67 } 68 private ValueParameter<DoubleData> MutationProbabilityParameter { 69 get { return (ValueParameter<DoubleData>)Parameters["MutationProbability"]; } 70 } 71 private OptionalConstrainedValueParameter<IManipulator> MutatorParameter { 72 get { return (OptionalConstrainedValueParameter<IManipulator>)Parameters["Mutator"]; } 73 } 74 private ValueParameter<IntData> ElitesParameter { 75 get { return (ValueParameter<IntData>)Parameters["Elites"]; } 76 } 77 private ValueParameter<IntData> MaximumGenerationsParameter { 78 get { return (ValueParameter<IntData>)Parameters["MaximumGenerations"]; } 79 } 80 #endregion 81 82 #region Properties 83 public IntData Seed { 84 get { return SeedParameter.Value; } 85 set { SeedParameter.Value = value; } 86 } 87 public BoolData SetSeedRandomly { 88 get { return SetSeedRandomlyParameter.Value; } 89 set { SetSeedRandomlyParameter.Value = value; } 90 } 91 public IntData PopulationSize { 92 get { return PopulationSizeParameter.Value; } 93 set { PopulationSizeParameter.Value = value; } 94 } 95 public ISelector Selector { 96 get { return SelectorParameter.Value; } 97 set { SelectorParameter.Value = value; } 98 } 99 public ICrossover Crossover { 100 get { return CrossoverParameter.Value; } 101 set { CrossoverParameter.Value = value; } 102 } 103 public DoubleData MutationProbability { 104 get { return MutationProbabilityParameter.Value; } 105 set { MutationProbabilityParameter.Value = value; } 106 } 107 public IManipulator Mutator { 108 get { return MutatorParameter.Value; } 109 set { MutatorParameter.Value = value; } 110 } 111 public IntData Elites { 112 get { return ElitesParameter.Value; } 113 set { ElitesParameter.Value = value; } 114 } 115 public IntData MaximumGenerations { 116 get { return MaximumGenerationsParameter.Value; } 117 set { MaximumGenerationsParameter.Value = value; } 118 } 119 private RandomCreator RandomCreator { 120 get { return (RandomCreator)OperatorGraph.InitialOperator; } 121 } 122 private PopulationCreator PopulationCreator { 123 get { return (PopulationCreator)RandomCreator.Successor; } 124 } 125 private SGAOperator SGAOperator { 126 get { return (SGAOperator)PopulationCreator.Successor; } 127 } 128 private List<ISelector> selectors; 129 private IEnumerable<ISelector> Selectors { 130 get { return selectors; } 131 } 132 #endregion 133 134 public SGA() 135 : base() { 136 Parameters.Add(new ValueParameter<IntData>("Seed", "The random seed used to initialize the new pseudo random number generator.", new IntData(0))); 137 Parameters.Add(new ValueParameter<BoolData>("SetSeedRandomly", "True if the random seed should be set to a random value, otherwise false.", new BoolData(true))); 138 Parameters.Add(new ValueParameter<IntData>("PopulationSize", "The size of the population of solutions.", new IntData(100))); 139 Parameters.Add(new ConstrainedValueParameter<ISelector>("Selector", "The operator used to select solutions for reproduction.")); 140 Parameters.Add(new ConstrainedValueParameter<ICrossover>("Crossover", "The operator used to cross solutions.")); 141 Parameters.Add(new ValueParameter<DoubleData>("MutationProbability", "The probability that the mutation operator is applied on a solution.", new DoubleData(0.05))); 142 Parameters.Add(new OptionalConstrainedValueParameter<IManipulator>("Mutator", "The operator used to mutate solutions.")); 143 Parameters.Add(new ValueParameter<IntData>("Elites", "The numer of elite solutions which are kept in each generation.", new IntData(1))); 144 Parameters.Add(new ValueParameter<IntData>("MaximumGenerations", "The maximum number of generations which should be processed.", new IntData(1000))); 145 146 RandomCreator randomCreator = new RandomCreator(); 147 PopulationCreator populationCreator = new PopulationCreator(); 148 SGAOperator sgaOperator = new SGAOperator(); 149 OperatorGraph.InitialOperator = randomCreator; 150 151 randomCreator.RandomParameter.ActualName = "Random"; 152 randomCreator.SeedParameter.ActualName = SeedParameter.Name; 153 randomCreator.SeedParameter.Value = null; 154 randomCreator.SetSeedRandomlyParameter.ActualName = SetSeedRandomlyParameter.Name; 155 randomCreator.SetSeedRandomlyParameter.Value = null; 156 randomCreator.Successor = populationCreator; 157 158 populationCreator.PopulationSizeParameter.ActualName = PopulationSizeParameter.Name; 159 populationCreator.Successor = sgaOperator; 160 161 sgaOperator.SelectorParameter.ActualName = SelectorParameter.Name; 162 sgaOperator.CrossoverParameter.ActualName = CrossoverParameter.Name; 163 sgaOperator.ElitesParameter.ActualName = ElitesParameter.Name; 164 sgaOperator.MaximumGenerationsParameter.ActualName = MaximumGenerationsParameter.Name; 165 sgaOperator.MutatorParameter.ActualName = MutatorParameter.Name; 166 sgaOperator.MutationProbabilityParameter.ActualName = MutationProbabilityParameter.Name; 167 sgaOperator.RandomParameter.ActualName = RandomCreator.RandomParameter.ActualName; 168 sgaOperator.ResultsParameter.ActualName = "Results"; 169 170 Initialze(); 171 } 172 [StorableConstructor] 173 private SGA(bool deserializing) : base() { } 174 175 public override IDeepCloneable Clone(Cloner cloner) { 176 SGA clone = (SGA)base.Clone(cloner); 177 clone.Initialze(); 178 return clone; 179 } 180 181 #region Events 182 protected override void OnProblemChanged() { 183 ParameterizeStochasticOperator(Problem.SolutionCreator); 184 ParameterizeStochasticOperator(Problem.Evaluator); 185 foreach (IOperator op in Problem.Operators) ParameterizeStochasticOperator(op); 186 ParameterizePopulationCreator(); 187 ParameterizeSGAOperator(); 188 ParameterizeSelectors(); 189 UpdateCrossovers(); 190 UpdateMutators(); 191 Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged); 192 base.OnProblemChanged(); 193 } 194 protected override void Problem_SolutionCreatorChanged(object sender, EventArgs e) { 195 ParameterizeStochasticOperator(Problem.SolutionCreator); 196 ParameterizePopulationCreator(); 197 base.Problem_SolutionCreatorChanged(sender, e); 198 } 199 protected override void Problem_EvaluatorChanged(object sender, EventArgs e) { 200 ParameterizeStochasticOperator(Problem.Evaluator); 201 ParameterizePopulationCreator(); 202 ParameterizeSGAOperator(); 203 ParameterizeSelectors(); 204 Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged); 205 base.Problem_EvaluatorChanged(sender, e); 206 } 207 protected override void Problem_OperatorsChanged(object sender, EventArgs e) { 208 foreach (IOperator op in Problem.Operators) ParameterizeStochasticOperator(op); 209 UpdateCrossovers(); 210 UpdateMutators(); 211 base.Problem_OperatorsChanged(sender, e); 212 } 213 private void ElitesParameter_ValueChanged(object sender, EventArgs e) { 214 Elites.ValueChanged += new EventHandler(Elites_ValueChanged); 215 ParameterizeSelectors(); 216 } 217 private void Elites_ValueChanged(object sender, EventArgs e) { 218 ParameterizeSelectors(); 219 } 220 private void PopulationSizeParameter_ValueChanged(object sender, EventArgs e) { 221 PopulationSize.ValueChanged += new EventHandler(PopulationSize_ValueChanged); 222 ParameterizeSelectors(); 223 } 224 private void PopulationSize_ValueChanged(object sender, EventArgs e) { 225 ParameterizeSelectors(); 226 } 227 private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) { 228 ParameterizeSGAOperator(); 229 ParameterizeSelectors(); 230 } 231 #endregion 232 233 #region Helpers 234 [StorableHook(HookType.AfterDeserialization)] 235 private void Initialze() { 236 InitializeSelectors(); 237 UpdateSelectors(); 238 PopulationSizeParameter.ValueChanged += new EventHandler(PopulationSizeParameter_ValueChanged); 239 PopulationSize.ValueChanged += new EventHandler(PopulationSize_ValueChanged); 240 ElitesParameter.ValueChanged += new EventHandler(ElitesParameter_ValueChanged); 241 Elites.ValueChanged += new EventHandler(Elites_ValueChanged); 242 if (Problem != null) 243 Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged); 244 } 245 246 private void ParameterizePopulationCreator() { 247 PopulationCreator.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name; 248 PopulationCreator.SolutionCreatorParameter.ActualName = Problem.SolutionCreatorParameter.Name; 249 } 250 private void ParameterizeSGAOperator() { 251 SGAOperator.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name; 252 SGAOperator.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name; 253 SGAOperator.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName; 254 } 255 private void ParameterizeStochasticOperator(IOperator op) { 256 if (op is IStochasticOperator) 257 ((IStochasticOperator)op).RandomParameter.ActualName = RandomCreator.RandomParameter.ActualName; 258 } 259 private void InitializeSelectors() { 260 selectors = new List<ISelector>(); 261 if (ApplicationManager.Manager != null) { 262 selectors.AddRange(ApplicationManager.Manager.GetInstances<ISelector>().Where(x => !(x is IMultiObjectiveSelector)).OrderBy(x => x.Name)); 263 ParameterizeSelectors(); 264 } 265 } 266 private void ParameterizeSelectors() { 267 foreach (ISelector selector in Selectors) { 268 selector.CopySelected = new BoolData(true); 269 selector.NumberOfSelectedSubScopesParameter.Value = new IntData(2 * (PopulationSizeParameter.Value.Value - ElitesParameter.Value.Value)); 270 ParameterizeStochasticOperator(selector); 271 } 272 if (Problem != null) { 273 foreach (ISingleObjectiveSelector selector in Selectors.OfType<ISingleObjectiveSelector>()) { 274 selector.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name; 275 selector.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName; 276 } 277 } 278 } 279 private void UpdateSelectors() { 280 if (ApplicationManager.Manager != null) { 281 ISelector oldSelector = SelectorParameter.Value; 282 SelectorParameter.ValidValues.Clear(); 283 foreach (ISelector selector in Selectors.OrderBy(x => x.Name)) 284 SelectorParameter.ValidValues.Add(selector); 285 if (oldSelector != null) 286 SelectorParameter.Value = SelectorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldSelector.GetType()); 287 } 288 } 289 private void UpdateCrossovers() { 290 ICrossover oldCrossover = CrossoverParameter.Value; 291 CrossoverParameter.ValidValues.Clear(); 292 foreach (ICrossover crossover in Problem.Operators.OfType<ICrossover>().OrderBy(x => x.Name)) 293 CrossoverParameter.ValidValues.Add(crossover); 294 if (oldCrossover != null) 295 CrossoverParameter.Value = CrossoverParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldCrossover.GetType()); 296 } 297 private void UpdateMutators() { 298 IManipulator oldMutator = MutatorParameter.Value; 299 MutatorParameter.ValidValues.Clear(); 300 foreach (IManipulator mutator in Problem.Operators.OfType<IManipulator>().OrderBy(x => x.Name)) 301 MutatorParameter.ValidValues.Add(mutator); 302 if (oldMutator != null) 303 MutatorParameter.Value = MutatorParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldMutator.GetType()); 304 } 305 #endregion 278 306 } 279 307 } -
trunk/sources/HeuristicLab.Problems.TSP/3.3/TSP.cs
r2975 r2986 36 36 [Item("TSP", "Represents a symmetric Traveling Salesman Problem.")] 37 37 [Creatable("Problems")] 38 [EmptyStorableClass] 38 39 public sealed class TSP : ParameterizedNamedItem, ISingleObjectiveProblem { 39 40 public override Image ItemImage { … … 94 95 set { BestKnownQualityParameter.Value = value; } 95 96 } 96 private OperatorSetoperators;97 private List<IPermutationOperator> operators; 97 98 public IEnumerable<IOperator> Operators { 98 get { 99 if (operators == null) InitializeOperators(); 100 return operators; 101 } 102 } 103 #endregion 104 105 #region Persistence Properties 106 [Storable] 107 private object RestoreEvents { 108 get { return null; } 109 set { RegisterEvents(); } 99 get { return operators.Cast<IOperator>(); } 110 100 } 111 101 #endregion … … 127 117 ParameterizeEvaluator(); 128 118 129 RegisterEvents(); 130 } 119 Initialize(); 120 } 121 [StorableConstructor] 122 private TSP(bool deserializing) : base() { } 131 123 132 124 public override IDeepCloneable Clone(Cloner cloner) { 133 125 TSP clone = (TSP)base.Clone(cloner); 134 clone. RegisterEvents();126 clone.Initialize(); 135 127 return clone; 136 128 } … … 187 179 188 180 #region Helpers 189 private void RegisterEvents() { 181 [StorableHook(HookType.AfterDeserialization)] 182 private void Initialize() { 183 InitializeOperators(); 190 184 CoordinatesParameter.ValueChanged += new EventHandler(CoordinatesParameter_ValueChanged); 191 185 Coordinates.ItemChanged += new EventHandler<EventArgs<int, int>>(Coordinates_ItemChanged); … … 205 199 } 206 200 private void InitializeOperators() { 207 operators = new OperatorSet();201 operators = new List<IPermutationOperator>(); 208 202 if (ApplicationManager.Manager != null) { 209 foreach (IPermutationOperator op in ApplicationManager.Manager.GetInstances<IPermutationOperator>()) 210 operators.Add(op); 203 operators.AddRange(ApplicationManager.Manager.GetInstances<IPermutationOperator>()); 211 204 ParameterizeOperators(); 212 205 }
Note: See TracChangeset
for help on using the changeset viewer.