Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
02/03/11 12:23:40 (14 years ago)
Author:
mkofler
Message:

#852: Realized code cleanup as described in the reviewer comments by Andreas Beham.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleSwarmOptimization.cs

    r5342 r5410  
    3434using HeuristicLab.PluginInfrastructure;
    3535using HeuristicLab.Random;
     36using System.Collections.Generic;
    3637
    3738namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
     
    6566
    6667    #region Parameter Properties
    67     public ValueParameter<IntValue> SeedParameter {
    68       get { return (ValueParameter<IntValue>)Parameters["Seed"]; }
    69     }
    70     public ValueParameter<BoolValue> SetSeedRandomlyParameter {
    71       get { return (ValueParameter<BoolValue>)Parameters["SetSeedRandomly"]; }
    72     }
    73     public ValueParameter<IntValue> SwarmSizeParameter {
    74       get { return (ValueParameter<IntValue>)Parameters["SwarmSize"]; }
    75     }
    76     public ValueParameter<IntValue> MaxIterationsParameter {
    77       get { return (ValueParameter<IntValue>)Parameters["MaxIterations"]; }
    78     }
    79     public ValueParameter<DoubleValue> OmegaParameter {
    80       get { return (ValueParameter<DoubleValue>)Parameters["Omega"]; }
    81     }
    82     public ValueParameter<DoubleValue> Phi_PParameter {
    83       get { return (ValueParameter<DoubleValue>)Parameters["Phi_P"]; }
    84     }
    85     public ValueParameter<DoubleValue> Phi_GParameter {
    86       get { return (ValueParameter<DoubleValue>)Parameters["Phi_G"]; }
    87     }
    88     public ValueParameter<MultiAnalyzer> AnalyzerParameter {
    89       get { return (ValueParameter<MultiAnalyzer>)Parameters["Analyzer"]; }
    90     }
    91     public ValueLookupParameter<DoubleMatrix> VelocityBoundsParameter {
    92       get { return (ValueLookupParameter<DoubleMatrix>)Parameters["VelocityBounds"]; }
     68    public IValueParameter<IntValue> SeedParameter {
     69      get { return (IValueParameter<IntValue>)Parameters["Seed"]; }
     70    }
     71    public IValueParameter<BoolValue> SetSeedRandomlyParameter {
     72      get { return (IValueParameter<BoolValue>)Parameters["SetSeedRandomly"]; }
     73    }
     74    public IValueParameter<IntValue> SwarmSizeParameter {
     75      get { return (IValueParameter<IntValue>)Parameters["SwarmSize"]; }
     76    }
     77    public IValueParameter<IntValue> MaxIterationsParameter {
     78      get { return (IValueParameter<IntValue>)Parameters["MaxIterations"]; }
     79    }
     80    public IValueParameter<DoubleValue> OmegaParameter {
     81      get { return (IValueParameter<DoubleValue>)Parameters["Omega"]; }
     82    }
     83    public IValueParameter<DoubleValue> Phi_PParameter {
     84      get { return (IValueParameter<DoubleValue>)Parameters["Phi_P"]; }
     85    }
     86    public IValueParameter<DoubleValue> Phi_GParameter {
     87      get { return (IValueParameter<DoubleValue>)Parameters["Phi_G"]; }
     88    }
     89    public IValueParameter<MultiAnalyzer> AnalyzerParameter {
     90      get { return (IValueParameter<MultiAnalyzer>)Parameters["Analyzer"]; }
     91    }
     92    public IValueLookupParameter<DoubleMatrix> VelocityBoundsParameter {
     93      get { return (IValueLookupParameter<DoubleMatrix>)Parameters["VelocityBounds"]; }
    9394    }
    9495    public ConstrainedValueParameter<IParticleUpdater> ParticleUpdaterParameter {
    9596      get { return (ConstrainedValueParameter<IParticleUpdater>)Parameters["ParticleUpdater"]; }
    9697    }
    97     public ConstrainedValueParameter<ITopologyInitializer> TopologyInitializerParameter {
    98       get { return (ConstrainedValueParameter<ITopologyInitializer>)Parameters["TopologyInitializer"]; }
    99     }
    100     public ConstrainedValueParameter<ITopologyUpdater> TopologyUpdaterParameter {
    101       get { return (ConstrainedValueParameter<ITopologyUpdater>)Parameters["TopologyUpdater"]; }
     98    public OptionalConstrainedValueParameter<ITopologyInitializer> TopologyInitializerParameter {
     99      get { return (OptionalConstrainedValueParameter<ITopologyInitializer>)Parameters["TopologyInitializer"]; }
     100    }
     101    public OptionalConstrainedValueParameter<ITopologyUpdater> TopologyUpdaterParameter {
     102      get { return (OptionalConstrainedValueParameter<ITopologyUpdater>)Parameters["TopologyUpdater"]; }
    102103    }
    103104    public OptionalConstrainedValueParameter<IDiscreteDoubleMatrixModifier> VelocityBoundsUpdaterParameter {
     
    134135
    135136    [StorableConstructor]
    136     protected ParticleSwarmOptimization(bool deserializing) : base(deserializing) {
    137       Initialize();
     137    protected ParticleSwarmOptimization(bool deserializing)
     138      : base(deserializing) {
    138139    }
    139140    protected ParticleSwarmOptimization(ParticleSwarmOptimization original, Cloner cloner)
    140141      : base(original, cloner) {
    141142      qualityAnalyzer = cloner.Clone(original.qualityAnalyzer);
     143      Initialize();
     144    }
     145
     146    [StorableHook(HookType.AfterDeserialization)]
     147    private void AfterDeserialization() {
    142148      Initialize();
    143149    }
     
    154160      Parameters.Add(new ValueParameter<DoubleValue>("Phi_G", "Weight for global best position.", new DoubleValue(3.7)));
    155161      Parameters.Add(new ValueLookupParameter<DoubleMatrix>("VelocityBounds", "Maximum Velocity in every dimension", new DoubleMatrix(new double[,] { { -1, 1 } })));
    156       Parameters.Add(new ConstrainedValueParameter<IParticleUpdater>("ParticleUpdater", "Operator that calculates new position and velocity of a particle",
    157         new ItemSet<IParticleUpdater>(ApplicationManager.Manager.GetInstances<IParticleUpdater>())));
    158       Parameters.Add(new ConstrainedValueParameter<ITopologyInitializer>("TopologyInitializer", "Creates neighborhood description vectors",
    159         new ItemSet<ITopologyInitializer>(ApplicationManager.Manager.GetInstances<ITopologyInitializer>())));
    160       Parameters.Add(new ConstrainedValueParameter<ITopologyUpdater>("TopologyUpdater", "Updates the neighborhood description vectors",
    161         new ItemSet<ITopologyUpdater>(ApplicationManager.Manager.GetInstances<ITopologyUpdater>())));
     162      Parameters.Add(new ConstrainedValueParameter<IParticleUpdater>("ParticleUpdater", "Operator that calculates new position and velocity of a particle"));
     163      Parameters.Add(new OptionalConstrainedValueParameter<ITopologyInitializer>("TopologyInitializer", "Creates neighborhood description vectors"));
     164      Parameters.Add(new OptionalConstrainedValueParameter<ITopologyUpdater>("TopologyUpdater", "Updates the neighborhood description vectors"));
    162165      Parameters.Add(new OptionalConstrainedValueParameter<IDiscreteDoubleValueModifier>("OmegaUpdater", "Updates the omega parameter"));
    163166      Parameters.Add(new OptionalConstrainedValueParameter<IDiscreteDoubleMatrixModifier>("VelocityBoundsUpdater", "Adjusts the velocity bounds."));
    164167      ParticleUpdaterParameter.ActualValue = ParticleUpdaterParameter.ValidValues.SingleOrDefault(v => v.GetType() == typeof(TotallyConnectedParticleUpdater));
    165       TopologyInitializerParameter.ActualValue = TopologyInitializerParameter.ValidValues.SingleOrDefault(v => v.GetType() == typeof(EmptyTopologyInitializer));
    166168
    167169      RandomCreator randomCreator = new RandomCreator();
     
    274276      UpdateOmegaUpdater();
    275277      InitOmegaUpdater();
     278      UpdateTopologyInitializer();
    276279      Initialize();
    277     }
    278 
    279     private void Initialize() {
    280       TopologyInitializerParameter.ValueChanged += new EventHandler(TopologyInitializerParameter_ValueChanged);
    281       ParticleUpdaterParameter.ValueChanged += new EventHandler(ParticleUpdaterParameter_ValueChanged);
    282       TopologyUpdaterParameter.ValueChanged += new EventHandler(TopologyUpdaterParameter_ValueChanged);
    283     }
    284 
    285     void TopologyUpdaterParameter_ValueChanged(object sender, EventArgs e) {
    286       if (TopologyInitializer is EmptyTopologyInitializer) { // no topology updater allowed
    287         if (TopologyUpdater != null) {
    288           TopologyUpdater = null;
    289         }
    290       }
    291     }
    292 
    293     void ParticleUpdaterParameter_ValueChanged(object sender, EventArgs e) {
    294       if (TopologyInitializer is EmptyTopologyInitializer) { // only global particle updater allowed
    295         if (!(ParticleUpdater is IGlobalParticleUpdater)) {
    296           ParticleUpdater = ParticleUpdaterParameter.ValidValues.Where(x => x is IGlobalParticleUpdater).First();
    297         }
    298       } else {  // only local particle updater allowed
    299         if (!(ParticleUpdater is ILocalParticleUpdater)) {
    300           ParticleUpdater = ParticleUpdaterParameter.ValidValues.Where(x => x is ILocalParticleUpdater).First();
    301         }
    302       }
    303     }
    304 
    305     void TopologyInitializerParameter_ValueChanged(object sender, EventArgs e) {
    306       if (TopologyInitializer is EmptyTopologyInitializer) {   // only allow global particle update and no topology update
    307         if (ParticleUpdaterParameter.ValidValues.Count > 0) {
    308           if (!(ParticleUpdater is IGlobalParticleUpdater)) {
    309             ParticleUpdater = ParticleUpdaterParameter.ValidValues.Where(x => x is IGlobalParticleUpdater).First();
    310           }
    311         }
    312         if (TopologyUpdaterParameter.ValidValues.Count > 0) {
    313           if (!(TopologyUpdater != null)) {
    314             TopologyUpdater = null;
    315           }
    316         }
    317       } else { // only allow local particle update; topology change possible
    318         if (ParticleUpdaterParameter.ValidValues.Count > 0) {
    319           if (!(ParticleUpdater is ILocalParticleUpdater)) {
    320             ParticleUpdater = ParticleUpdaterParameter.ValidValues.Where(x => x is ILocalParticleUpdater).First();
    321           }
    322         }
    323       }
    324     }
    325 
    326     private static void InitializeParticleCreator(CombinedOperator particleCreator) {
    327       Placeholder positionCreator = new Placeholder();
    328       Assigner personalBestPositionAssigner = new Assigner();
    329       UniformRandomRealVectorCreator velocityCreator = new UniformRandomRealVectorCreator();
    330 
    331       particleCreator.Name = "Particle Creator";
    332       particleCreator.OperatorGraph.InitialOperator = positionCreator;
    333 
    334       positionCreator.Name = "(SolutionCreator)";
    335       positionCreator.OperatorParameter.ActualName = "SolutionCreator";
    336       positionCreator.Successor = personalBestPositionAssigner;
    337 
    338       personalBestPositionAssigner.LeftSideParameter.ActualName = "PersonalBestPoint";
    339       personalBestPositionAssigner.RightSideParameter.ActualName = "Point";
    340       personalBestPositionAssigner.Successor = velocityCreator;
    341 
    342       velocityCreator.LengthParameter.ActualName = "ProblemSize";
    343       velocityCreator.BoundsParameter.ActualName = "VelocityBounds";
    344       velocityCreator.RealVectorParameter.ActualName = "Velocity";
    345280    }
    346281
     
    369304      UpdateAnalyzers();
    370305      ParameterizeAnalyzers();
    371       Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
    372306      base.OnProblemChanged();
    373307    }
    374308
     309    void TopologyInitializerParameter_ValueChanged(object sender, EventArgs e) {
     310      this.UpdateTopologyParameters();
     311    }
     312
     313    void VelocityBoundsUpdaterParameter_ValueChanged(object sender, EventArgs e) {
     314      if (VelocityBoundsParameter.Value != null) {
     315        foreach (IDiscreteDoubleMatrixModifier matrixOp in VelocityBoundsUpdaterParameter.Value.ScalingOperatorParameter.ValidValues) {
     316          matrixOp.ValueParameter.ActualName = VelocityBoundsUpdater.ScaleParameter.Name;
     317          matrixOp.StartValueParameter.Value = new DoubleValue(VelocityBoundsUpdater.ScaleParameter.ActualValue.Value);
     318        }
     319      }
     320    }
    375321    #endregion
    376322
    377323    #region Helpers
    378     private void InitializeParticleUpdaters() {
    379     }
    380 
    381     private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
     324    private void Initialize() {
     325      TopologyInitializerParameter.ValueChanged += new EventHandler(TopologyInitializerParameter_ValueChanged);
     326    }
     327
     328    private static void InitializeParticleCreator(CombinedOperator particleCreator) {
     329      Placeholder positionCreator = new Placeholder();
     330      Assigner personalBestPositionAssigner = new Assigner();
     331      UniformRandomRealVectorCreator velocityCreator = new UniformRandomRealVectorCreator();
     332
     333      particleCreator.Name = "Particle Creator";
     334      particleCreator.OperatorGraph.InitialOperator = positionCreator;
     335
     336      positionCreator.Name = "(SolutionCreator)";
     337      positionCreator.OperatorParameter.ActualName = "SolutionCreator";
     338      positionCreator.Successor = personalBestPositionAssigner;
     339
     340      personalBestPositionAssigner.LeftSideParameter.ActualName = "PersonalBestPoint";
     341      personalBestPositionAssigner.RightSideParameter.ActualName = "Point";
     342      personalBestPositionAssigner.Successor = velocityCreator;
     343
     344      velocityCreator.LengthParameter.ActualName = "ProblemSize";
     345      velocityCreator.BoundsParameter.ActualName = "VelocityBounds";
     346      velocityCreator.RealVectorParameter.ActualName = "Velocity";
    382347    }
    383348
     
    385350      qualityAnalyzer = new BestAverageWorstQualityAnalyzer();
    386351      ParameterizeAnalyzers();
     352    }
     353
     354    private void ParameterizeAnalyzers() {
     355      if (Problem != null) {
     356        qualityAnalyzer.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
     357        qualityAnalyzer.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
     358        qualityAnalyzer.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
     359      }
     360    }
     361
     362    private void UpdateAnalyzers() {
     363      Analyzer.Operators.Clear();
     364      if (Problem != null) {
     365        foreach (IAnalyzer analyzer in Problem.Operators.OfType<IAnalyzer>())
     366          Analyzer.Operators.Add(analyzer);
     367      }
     368      Analyzer.Operators.Add(qualityAnalyzer);
    387369    }
    388370
     
    399381    }
    400382
    401     void VelocityBoundsUpdaterParameter_ValueChanged(object sender, EventArgs e) {
    402       if (VelocityBoundsParameter.Value != null) {
    403         foreach (IDiscreteDoubleMatrixModifier matrixOp in VelocityBoundsUpdaterParameter.Value.ScalingOperatorParameter.ValidValues) {
    404             matrixOp.ValueParameter.ActualName = VelocityBoundsUpdater.ScaleParameter.Name;
    405             matrixOp.StartValueParameter.Value = new DoubleValue(VelocityBoundsUpdater.ScaleParameter.ActualValue.Value);
    406         }
    407       }
    408     }
    409 
    410383    private void InitOmegaUpdater() {
    411384      foreach (IDiscreteDoubleValueModifier updater in OmegaUpdaterParameter.ValidValues) {
     
    431404    }
    432405
    433     private void ParameterizeAnalyzers() {
    434       if (Problem != null) {
    435         qualityAnalyzer.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
    436         qualityAnalyzer.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
    437         qualityAnalyzer.BestKnownQualityParameter.ActualName = Problem.BestKnownQualityParameter.Name;
    438       }
    439     }
    440 
    441     private void UpdateAnalyzers() {
    442       Analyzer.Operators.Clear();
    443       if (Problem != null) {
    444         foreach (IAnalyzer analyzer in Problem.Operators.OfType<IAnalyzer>())
    445           Analyzer.Operators.Add(analyzer);
    446       }
    447       Analyzer.Operators.Add(qualityAnalyzer);
    448     }
    449 
     406    private void UpdateTopologyInitializer() {
     407      ITopologyInitializer oldTopologyInitializer = TopologyInitializer;
     408      TopologyInitializerParameter.ValidValues.Clear();
     409      foreach (ITopologyInitializer topologyInitializer in ApplicationManager.Manager.GetInstances<ITopologyInitializer>().OrderBy(x => x.Name)) {
     410        TopologyInitializerParameter.ValidValues.Add(topologyInitializer);
     411      }
     412      if (oldTopologyInitializer != null && TopologyInitializerParameter.ValidValues.Any(x => x.GetType() == oldTopologyInitializer.GetType()))
     413        TopologyInitializer = TopologyInitializerParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldTopologyInitializer.GetType());
     414      UpdateTopologyParameters();
     415    }
     416
     417    private void UpdateTopologyParameters() {
     418      ITopologyUpdater oldTopologyUpdater = TopologyUpdater;
     419      IParticleUpdater oldParticleUpdater = ParticleUpdater;
     420      ClearTopologyParameters();
     421      if (TopologyInitializer != null) {
     422        foreach (ITopologyUpdater topologyUpdater in ApplicationManager.Manager.GetInstances<ITopologyUpdater>())
     423          TopologyUpdaterParameter.ValidValues.Add(topologyUpdater);
     424        foreach (IParticleUpdater particleUpdater in ApplicationManager.Manager.GetInstances<ILocalParticleUpdater>())
     425          ParticleUpdaterParameter.ValidValues.Add(particleUpdater);
     426      } else {
     427        foreach (IParticleUpdater particleUpdater in ApplicationManager.Manager.GetInstances<IGlobalParticleUpdater>())
     428          ParticleUpdaterParameter.ValidValues.Add(particleUpdater);
     429      }
     430      if (oldTopologyUpdater != null) {
     431        ITopologyUpdater newTopologyUpdater = TopologyUpdaterParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldParticleUpdater.GetType());
     432        if (newTopologyUpdater != null) TopologyUpdater = newTopologyUpdater;
     433      }
     434      if (oldParticleUpdater != null) {
     435        IParticleUpdater newParticleUpdater = ParticleUpdaterParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldParticleUpdater.GetType());
     436        if (newParticleUpdater != null) ParticleUpdater = newParticleUpdater;
     437      }
     438    }
     439
     440    private void ClearTopologyParameters() {
     441      TopologyUpdaterParameter.ValidValues.Clear();
     442      ParticleUpdaterParameter.ValidValues.Clear();
     443    }
    450444    #endregion
    451      
     445
    452446  }
    453447}
Note: See TracChangeset for help on using the changeset viewer.