Changeset 11739 for branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/New/SingleObjectiveProgrammableProblem.cs
- Timestamp:
- 01/08/15 15:52:05 (9 years ago)
- Location:
- branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/New
- Files:
-
- 1 added
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/New/SingleObjectiveProgrammableProblem.cs
r11736 r11739 20 20 #endregion 21 21 22 using System;23 using System.Collections.Generic;24 using System.Drawing;25 22 using System.Linq; 26 23 using HeuristicLab.Analysis; 27 24 using HeuristicLab.Common; 28 25 using HeuristicLab.Core; 29 using HeuristicLab.Encodings.RealVectorEncoding;30 26 using HeuristicLab.Optimization; 31 using HeuristicLab.Parameters;32 27 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; 33 28 34 29 namespace HeuristicLab.Problems.Programmable { 35 [Item("Programmable Problem (single-objective)", "Represents a single-objective problem that can be programmed.")]36 [Creatable("Problems")]37 30 [StorableClass] 38 public class SingleObjectiveProgrammableProblem : SingleObjectiveHeuristicOptimizationProblem<ISingleObjectiveProgrammableProblemEvaluator, ISolutionCreator>, IParameterizedNamedItem, IStorableContent { 39 public string Filename { get; set; } 40 41 public static new Image StaticItemImage { 42 get { return Common.Resources.VSImageLibrary.Script; } 43 } 44 45 public new ParameterCollection Parameters { 46 get { return base.Parameters; } 47 } 48 IKeyedItemCollection<string, IParameter> IParameterizedItem.Parameters { 49 get { return Parameters; } 50 } 51 52 public IValueParameter<ISingleObjectiveProblemDefinition> ProblemDefinitionParameter { 53 get { return (IValueParameter<ISingleObjectiveProblemDefinition>)Parameters["ProblemDefinition"]; } 54 } 55 56 protected IValueParameter<IEncoding> EncodingParameter { 57 get { return (IValueParameter<IEncoding>)Parameters["Encoding"]; } 58 } 59 60 public ISingleObjectiveProblemDefinition ProblemDefinition { 61 get { return ProblemDefinitionParameter.Value; } 62 set { ProblemDefinitionParameter.Value = value; } 63 } 64 65 66 public override IEnumerable<IParameterizedItem> ExecutionContextItems { 67 get { return base.ExecutionContextItems.Concat(new[] { ProblemDefinition.Encoding }); } 68 } 69 protected override IEnumerable<IItem> GetOperators() { 70 return base.GetOperators().Concat(ProblemDefinition.Encoding.Operators); 71 } 72 31 public abstract class SingleObjectiveProgrammableProblem<TEncoding> : ProgrammableProblem<TEncoding, SingleObjectiveEvaluator>, ISingleObjectiveProblemDefinition 32 where TEncoding : class, IEncoding { 73 33 [StorableConstructor] 74 34 protected SingleObjectiveProgrammableProblem(bool deserializing) : base(deserializing) { } 75 35 76 protected SingleObjectiveProgrammableProblem(SingleObjectiveProgrammableProblem original, Cloner cloner)36 protected SingleObjectiveProgrammableProblem(SingleObjectiveProgrammableProblem<TEncoding> original, Cloner cloner) 77 37 : base(original, cloner) { 78 RegisterEventHandlers();38 ParameterizeOperators(); 79 39 } 80 public SingleObjectiveProgrammableProblem()81 : base(new SingleObjectiveEvaluator(), new MultiEncodingCreator()) {82 Parameters.Add(new ValueParameter<ISingleObjectiveProblemDefinition>("ProblemDefinition", "Defines the problem.", new SingleObjectiveProblemScript() { Name = Name }));83 Parameters.Add(new ValueParameter<IEncoding>("Encoding", "Describes the configuration of the encoding, what the variables are called, what type they are and their bounds if any."));84 40 41 protected SingleObjectiveProgrammableProblem() 42 : base() { 85 43 86 44 Operators.Add(new BestScopeSolutionAnalyzer()); 45 Operators.Add(new SingleObjectiveEvaluator()); 87 46 Operators.Add(new SingleObjectiveAnalyzer()); 88 Operators.Add(Evaluator);89 47 90 RegisterEventHandlers(); 91 } 92 93 public override IDeepCloneable Clone(Cloner cloner) { 94 return new SingleObjectiveProgrammableProblem(this, cloner); 48 ParameterizeOperators(); 95 49 } 96 50 97 51 [StorableHook(HookType.AfterDeserialization)] 98 // ReSharper disable UnusedMember.Local99 52 private void AfterDeserialization() { 100 RegisterEventHandlers(); 101 } 102 // ReSharper restore UnusedMember.Local 103 104 private void RegisterEventHandlers() { 105 ProblemDefinitionParameter.ValueChanged += ProblemDefinitionParameterOnValueChanged; 106 RegisterProblemDefinitionEventHandlers(); 53 ParameterizeOperators(); 107 54 } 108 55 109 private void ProblemDefinitionParameterOnValueChanged(object sender, EventArgs eventArgs) { 110 RegisterProblemDefinitionEventHandlers(); 111 Parameterize(); 112 } 56 public abstract bool Maximization { get; } 57 public abstract double Evaluate(Individual individual, IRandom random); 58 public virtual void Analyze(Individual[] individuals, double[] qualities, ResultCollection results) { } 113 59 114 private void RegisterProblemDefinitionEventHandlers() {115 ProblemDefinitionParameter.Value.ProblemDefinitionChanged += ProblemDefinitionChanged;116 ProblemDefinitionParameter.Value.NameChanged += ProblemDefinitionNameChanged;117 }118 119 private void ProblemDefinitionNameChanged(object sender, EventArgs eventArgs) {120 if (sender != ProblemDefinitionParameter.Value) return;121 Name = ProblemDefinitionParameter.Value.Name;122 }123 124 protected override void OnNameChanged() {125 base.OnNameChanged();126 ProblemDefinitionParameter.Value.Name = Name;127 }128 60 129 61 protected override void OnEvaluatorChanged() { 130 62 base.OnEvaluatorChanged(); 131 Parameterize ();63 ParameterizeOperators(); 132 64 } 133 65 134 protected virtual void ProblemDefinitionChanged(object sender, EventArgs eventArgs) { 135 Parameterize(); 66 protected override void ParameterizeOperators() { 67 base.ParameterizeOperators(); 68 foreach (var op in Operators.OfType<ISingleObjectiveEvaluationOperator>()) 69 op.EvaluateFunc = Evaluate; 70 foreach (var op in Operators.OfType<ISingleObjectiveAnalysisOperator>()) 71 op.AnalyzeAction = Analyze; 136 72 } 137 73 138 protected virtual void Parameterize() {139 var definition = ProblemDefinitionParameter.Value;140 if (definition == null) return;141 142 IEncoding encoding = definition.Encoding;143 SolutionCreator = encoding.SolutionCreator;144 145 EncodingParameter.Value = encoding;146 Maximization.Value = definition.IsMaximizationProblem;147 148 Evaluator.EncodingParameter.ActualName = EncodingParameter.Name;149 Evaluator.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;150 foreach (var evalOp in Operators.OfType<ISingleObjectiveProgrammableProblemEvaluator>()) {151 evalOp.EncodingParameter.ActualName = EncodingParameter.Name;152 evalOp.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;153 }154 foreach (var analyzeOp in Operators.OfType<ISingleObjectiveProgrammableProblemAnalyzer>()) {155 analyzeOp.EncodingParameter.ActualName = EncodingParameter.Name;156 analyzeOp.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;157 analyzeOp.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;158 }159 160 ConfigureSingleEncodingOperators();161 UpdateImprovementOperators();162 UpdateMoveOperators();163 }164 165 166 protected virtual void ConfigureSingleEncodingOperators() {167 foreach (var su in GetOperators().OfType<IRealVectorSwarmUpdater>()) {168 su.MaximizationParameter.ActualName = MaximizationParameter.Name;169 }170 }171 172 protected virtual void UpdateImprovementOperators() {173 if (!Operators.Any(x => x is SingleObjectiveImprover))174 Operators.Add(new SingleObjectiveImprover());175 foreach (var improver in Operators.OfType<SingleObjectiveImprover>()) {176 improver.EncodingParameter.ActualName = EncodingParameter.Name;177 improver.MaximizationParameter.ActualName = MaximizationParameter.Name;178 improver.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;179 improver.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;180 }181 }182 protected virtual void UpdateMoveOperators() {183 if (!Operators.Any(x => x is SingleObjectiveMoveGenerator))184 Operators.Add(new SingleObjectiveMoveGenerator());185 if (!Operators.Any(x => x is SingleObjectiveMoveEvaluator))186 Operators.Add(new SingleObjectiveMoveEvaluator());187 if (!Operators.Any(x => x is SingleObjectiveMoveMaker))188 Operators.Add(new SingleObjectiveMoveMaker());189 190 foreach (var generator in Operators.OfType<SingleObjectiveMoveGenerator>()) {191 generator.EncodingParameter.ActualName = EncodingParameter.Name;192 generator.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;193 }194 foreach (var evaluator in Operators.OfType<SingleObjectiveMoveEvaluator>()) {195 evaluator.EncodingParameter.ActualName = EncodingParameter.Name;196 evaluator.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;197 evaluator.ProblemDefinitionParameter.ActualName = ProblemDefinitionParameter.Name;198 }199 foreach (var maker in Operators.OfType<SingleObjectiveMoveMaker>()) {200 maker.EncodingParameter.ActualName = EncodingParameter.Name;201 maker.MoveQualityParameter.ActualName = Operators.OfType<SingleObjectiveMoveEvaluator>().First().MoveQualityParameter.ActualName;202 maker.QualityParameter.ActualName = Evaluator.QualityParameter.ActualName;203 }204 }205 74 } 206 75 }
Note: See TracChangeset
for help on using the changeset viewer.