Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
01/08/15 15:52:05 (9 years ago)
Author:
mkommend
Message:

#2174: Worked on operators and programmable problem base classes and scripts.

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  
    2020#endregion
    2121
    22 using System;
    23 using System.Collections.Generic;
    24 using System.Drawing;
    2522using System.Linq;
    2623using HeuristicLab.Analysis;
    2724using HeuristicLab.Common;
    2825using HeuristicLab.Core;
    29 using HeuristicLab.Encodings.RealVectorEncoding;
    3026using HeuristicLab.Optimization;
    31 using HeuristicLab.Parameters;
    3227using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    3328
    3429namespace HeuristicLab.Problems.Programmable {
    35   [Item("Programmable Problem (single-objective)", "Represents a single-objective problem that can be programmed.")]
    36   [Creatable("Problems")]
    3730  [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 {
    7333    [StorableConstructor]
    7434    protected SingleObjectiveProgrammableProblem(bool deserializing) : base(deserializing) { }
    7535
    76     protected SingleObjectiveProgrammableProblem(SingleObjectiveProgrammableProblem original, Cloner cloner)
     36    protected SingleObjectiveProgrammableProblem(SingleObjectiveProgrammableProblem<TEncoding> original, Cloner cloner)
    7737      : base(original, cloner) {
    78       RegisterEventHandlers();
     38      ParameterizeOperators();
    7939    }
    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."));
    8440
     41    protected SingleObjectiveProgrammableProblem()
     42      : base() {
    8543
    8644      Operators.Add(new BestScopeSolutionAnalyzer());
     45      Operators.Add(new SingleObjectiveEvaluator());
    8746      Operators.Add(new SingleObjectiveAnalyzer());
    88       Operators.Add(Evaluator);
    8947
    90       RegisterEventHandlers();
    91     }
    92 
    93     public override IDeepCloneable Clone(Cloner cloner) {
    94       return new SingleObjectiveProgrammableProblem(this, cloner);
     48      ParameterizeOperators();
    9549    }
    9650
    9751    [StorableHook(HookType.AfterDeserialization)]
    98     // ReSharper disable UnusedMember.Local
    9952    private void AfterDeserialization() {
    100       RegisterEventHandlers();
    101     }
    102     // ReSharper restore UnusedMember.Local
    103 
    104     private void RegisterEventHandlers() {
    105       ProblemDefinitionParameter.ValueChanged += ProblemDefinitionParameterOnValueChanged;
    106       RegisterProblemDefinitionEventHandlers();
     53      ParameterizeOperators();
    10754    }
    10855
    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) { }
    11359
    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     }
    12860
    12961    protected override void OnEvaluatorChanged() {
    13062      base.OnEvaluatorChanged();
    131       Parameterize();
     63      ParameterizeOperators();
    13264    }
    13365
    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;
    13672    }
    13773
    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     }
    20574  }
    20675}
Note: See TracChangeset for help on using the changeset viewer.