Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
12/06/10 14:45:27 (13 years ago)
Author:
epitzer
Message:

Simple but complete PSO implementation (#852)

Location:
branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3
Files:
2 edited

Legend:

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

    • Property svn:ignore
      •  

        old new  
        33obj
        44*.user
         5*.suo
  • branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleSwarmOptimization.cs

    r4068 r5033  
    2121
    2222using System;
    23 using System.Collections.Generic;
    2423using System.Linq;
    2524using HeuristicLab.Analysis;
     
    3635
    3736namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
     37
    3838  [Item("Particle Swarm Optimization", "A particle swarm optimization algorithm.")]
    3939  [Creatable("Algorithms")]
    4040  [StorableClass]
    41   public sealed class ParticleSwarmOptimization : EngineAlgorithm {
     41  public class ParticleSwarmOptimization : EngineAlgorithm {
     42
    4243    #region Problem Properties
    4344    public override Type ProblemType {
     
    4849      set { base.Problem = value; }
    4950    }
    50     public IRealVectorEncoder Encoder {
    51       get { return EncoderParameter.Value; }
    52       set { EncoderParameter.Value = value; }
    53     }
    5451    public MultiAnalyzer Analyzer {
    5552      get { return AnalyzerParameter.Value; }
     
    5956
    6057    #region Parameter Properties
    61     private ValueParameter<IntValue> SeedParameter {
     58    public ValueParameter<IntValue> SeedParameter {
    6259      get { return (ValueParameter<IntValue>)Parameters["Seed"]; }
    6360    }
    64     private ValueParameter<BoolValue> SetSeedRandomlyParameter {
     61    public ValueParameter<BoolValue> SetSeedRandomlyParameter {
    6562      get { return (ValueParameter<BoolValue>)Parameters["SetSeedRandomly"]; }
    6663    }
    67     private ValueParameter<IntValue> SwarmSizeParameter {
     64    public ValueParameter<IntValue> SwarmSizeParameter {
    6865      get { return (ValueParameter<IntValue>)Parameters["SwarmSize"]; }
    6966    }
    70     private ValueParameter<IntValue> MaxIterationsParameter {
     67    public ValueParameter<IntValue> MaxIterationsParameter {
    7168      get { return (ValueParameter<IntValue>)Parameters["MaxIterations"]; }
    7269    }
    73     private OptionalConstrainedValueParameter<IRealVectorEncoder> EncoderParameter {
    74       get { return (OptionalConstrainedValueParameter<IRealVectorEncoder>)Parameters["Encoder"]; }
    75     }
    76     private ValueParameter<MultiAnalyzer> AnalyzerParameter {
     70    public ValueParameter<DoubleValue> OmegaParameter {
     71      get { return (ValueParameter<DoubleValue>)Parameters["Omega"]; }
     72    }
     73    public ValueParameter<DoubleValue> Phi_PParameter {
     74      get { return (ValueParameter<DoubleValue>)Parameters["Phi_P"]; }
     75    }
     76    public ValueParameter<DoubleValue> Phi_GParameter {
     77      get { return (ValueParameter<DoubleValue>)Parameters["Phi_G"]; }
     78    }
     79    public ValueParameter<MultiAnalyzer> AnalyzerParameter {
    7780      get { return (ValueParameter<MultiAnalyzer>)Parameters["Analyzer"]; }
     81    }
     82    public ValueLookupParameter<DoubleMatrix> VelocityBoundsParameter {
     83      get { return (ValueLookupParameter<DoubleMatrix>)Parameters["VelocityBounds"]; }
    7884    }
    7985    #endregion
     
    8187    #region Properties
    8288    [Storable]
    83     private ParticleSwarmOptimizationMainLoop mainLoop; // Check this !
    84     private ParticleSwarmOptimizationMainLoop MainLoop {
    85       get { return mainLoop; }
    86     }
    87     [Storable]
    88     private Assigner bestLocalQualityInitalizer; // Check this !
    89     private Assigner BestLocalQualityInitalizer {
    90       get { return bestLocalQualityInitalizer; }
    91     }
    92     [Storable]
    9389    private BestAverageWorstQualityAnalyzer qualityAnalyzer;
    9490    #endregion
     91
     92    [StorableConstructor]
     93    protected ParticleSwarmOptimization(bool deserializing) : base(deserializing) { }
     94    protected ParticleSwarmOptimization(ParticleSwarmOptimization original, Cloner cloner)
     95      : base(original, cloner) {
     96      qualityAnalyzer = cloner.Clone(original.qualityAnalyzer);
     97    }
    9598
    9699    public ParticleSwarmOptimization()
     
    100103      Parameters.Add(new ValueParameter<IntValue>("SwarmSize", "Size of the particle swarm.", new IntValue(10)));
    101104      Parameters.Add(new ValueParameter<IntValue>("MaxIterations", "Maximal number of iterations.", new IntValue(1000)));
    102       Parameters.Add(new ConstrainedValueParameter<IRealVectorEncoder>("Encoder", "The operator used to encode solutions as position vector."));
    103105      Parameters.Add(new ValueParameter<MultiAnalyzer>("Analyzer", "The operator used to analyze each generation.", new MultiAnalyzer()));
     106      Parameters.Add(new ValueParameter<DoubleValue>("Omega", "Weight for particle's velocity vector.", new DoubleValue(-0.2)));
     107      Parameters.Add(new ValueParameter<DoubleValue>("Phi_P", "Weight for particle's personal best position.", new DoubleValue(-0.01)));
     108      Parameters.Add(new ValueParameter<DoubleValue>("Phi_G", "Weight for global best position.", new DoubleValue(3.7)));
     109      Parameters.Add(new ValueLookupParameter<DoubleMatrix>("VelocityBounds", "Maximum Velocity in every dimension", new DoubleMatrix(new double[,] { { -1, 1 } })));
     110
    104111      RandomCreator randomCreator = new RandomCreator();
     112      VariableCreator variableCreator = new VariableCreator();
    105113      SolutionsCreator solutionsCreator = new SolutionsCreator();
    106       UniformSubScopesProcessor uniformSubScopesProcessor = new UniformSubScopesProcessor();
    107       UniformSubScopesProcessor uniformSubScopesProcessor2 = new UniformSubScopesProcessor();
    108       VariableCreator variableCreator = new VariableCreator();
    109       VariableCreator localVariableCreator = new VariableCreator();
    110       Placeholder encoder = new Placeholder();
    111       UniformRandomRealVectorCreator velocityVectorCreator = new UniformRandomRealVectorCreator();
    112       bestLocalQualityInitalizer = new Assigner();
    113       Assigner bestLocalPositionInitalizer = new Assigner();
    114       Assigner bestGlobalPositionInitalizer = new Assigner();
    115       mainLoop = new ParticleSwarmOptimizationMainLoop();
    116       BestAverageWorstQualityCalculator bawCalculator = new BestAverageWorstQualityCalculator();
    117       Comparator comparator = new Comparator();
    118       ConditionalBranch branch = new ConditionalBranch();
    119 
    120       variableCreator.CollectedValues.Add(new ValueParameter<RealVector>("CurrentBestPosition", new RealVector()));
    121       variableCreator.CollectedValues.Add(new ValueParameter<DoubleMatrix>("ZeroBounds", new DoubleMatrix(new double[,] { { 0, 0 } })));
    122       variableCreator.CollectedValues.Add(new ValueParameter<IntValue>("Length", new IntValue(2)));
    123 
    124       localVariableCreator.CollectedValues.Add(new ValueParameter<DoubleValue>("BestQuality", new DoubleValue(0)));
    125       localVariableCreator.CollectedValues.Add(new ValueParameter<RealVector>("BestPosition", new RealVector()));
    126 
    127       randomCreator.RandomParameter.ActualName = "Random";
    128       randomCreator.SeedParameter.ActualName = SeedParameter.Name;
     114      CombinedOperator particleCreator = new CombinedOperator();
     115      Placeholder evaluatorPlaceholder = new Placeholder();
     116      Assigner bestPersonalQualityAssigner = new Assigner();
     117      BestPointInitializer bestPositionInitializer = new BestPointInitializer();
     118      Placeholder analyzerPlaceholder = new Placeholder();
     119      UniformSubScopesProcessor uniformSubScopeProcessor = new UniformSubScopesProcessor();
     120      ParticleUpdater particleUpdater = new ParticleUpdater();
     121      Placeholder evaluatorPlaceholder2 = new Placeholder();
     122      SwarmUpdater swarmUpdater = new SwarmUpdater();
     123      Placeholder analyzerPlaceholder2 = new Placeholder();
     124      IntCounter currentIterationCounter = new IntCounter();
     125      Comparator currentIterationComparator = new Comparator();
     126      ConditionalBranch conditionalBranch = new ConditionalBranch();
     127
     128      OperatorGraph.InitialOperator = randomCreator;
     129
     130      randomCreator.SetSeedRandomlyParameter.Value = null;
    129131      randomCreator.SeedParameter.Value = null;
    130       randomCreator.SetSeedRandomlyParameter.ActualName = SetSeedRandomlyParameter.Name;
    131       randomCreator.SetSeedRandomlyParameter.Value = null;
    132 
    133       solutionsCreator.NumberOfSolutionsParameter.ActualName = SwarmSizeParameter.Name;
    134 
    135       encoder.OperatorParameter.ActualName = "Encoder";
    136 
    137       velocityVectorCreator.BoundsParameter.ActualName = "ZeroBounds";
    138       velocityVectorCreator.RealVectorParameter.ActualName = "Velocity";
    139 
    140       bestLocalQualityInitalizer.LeftSideParameter.ActualName = "BestQuality"; // cloned value
    141       bestLocalQualityInitalizer.RightSideParameter.ActualName = "Quality"; // FIXME!!! Should be mapped
    142 
    143       bestLocalPositionInitalizer.LeftSideParameter.ActualName = "BestPosition";
    144       bestLocalPositionInitalizer.RightSideParameter.ActualName = "Position"; // FixMe
    145 
    146       bestGlobalPositionInitalizer.LeftSideParameter.ActualName = "CurrentBestPosition";
    147       bestGlobalPositionInitalizer.RightSideParameter.ActualName = "BestPosition";
    148 
    149       bawCalculator.AverageQualityParameter.ActualName = "CurrentAverageBestQuality";
    150       bawCalculator.BestQualityParameter.ActualName = "CurrentBestBestQuality";
    151       bawCalculator.MaximizationParameter.ActualName = "Maximization"; // FIXME
    152       bawCalculator.QualityParameter.ActualName = "Quality";
    153       bawCalculator.WorstQualityParameter.ActualName = "CurrentWorstBestQuality";
    154 
    155       comparator.Comparison = new Comparison(ComparisonType.Equal);
    156       comparator.LeftSideParameter.ActualName = "Quality";
    157       comparator.ResultParameter.ActualName = "NewGlobalBest";
    158       comparator.RightSideParameter.ActualName = "CurrentBestBestQuality";
    159 
    160       branch.ConditionParameter.ActualName = "NewGlobalBest";
    161       branch.TrueBranch = bestGlobalPositionInitalizer; // copy position vector
    162 
    163       mainLoop.MaximumGenerationsParameter.ActualName = MaxIterationsParameter.Name;
    164       mainLoop.ResultsParameter.ActualName = "Results";
    165       mainLoop.AnalyzerParameter.ActualName = AnalyzerParameter.Name;
    166 
    167       OperatorGraph.InitialOperator = randomCreator;
    168       randomCreator.Successor = solutionsCreator;
    169       solutionsCreator.Successor = variableCreator;
    170       variableCreator.Successor = uniformSubScopesProcessor;
    171       uniformSubScopesProcessor.Operator = encoder;
    172       encoder.Successor = velocityVectorCreator;
    173       velocityVectorCreator.Successor = localVariableCreator;
    174       localVariableCreator.Successor = bestLocalQualityInitalizer;
    175       bestLocalQualityInitalizer.Successor = bestLocalPositionInitalizer;
    176       uniformSubScopesProcessor.Successor = bawCalculator; // mainLoop;
    177       bawCalculator.Successor = uniformSubScopesProcessor2;
    178       uniformSubScopesProcessor2.Operator = comparator;
    179       comparator.Successor = branch;
    180       uniformSubScopesProcessor2.Successor = mainLoop;
     132      randomCreator.Successor = variableCreator;
     133
     134      variableCreator.CollectedValues.Add(new ValueParameter<IntValue>("CurrentIteration", new IntValue(0)));
     135      variableCreator.Successor = solutionsCreator;
     136
     137      solutionsCreator.NumberOfSolutionsParameter.ActualName = "SwarmSize";
     138      solutionsCreator.EvaluatorParameter.Value = evaluatorPlaceholder;
     139      solutionsCreator.SolutionCreatorParameter.Value = particleCreator;
     140      solutionsCreator.Successor = bestPositionInitializer;
     141
     142      InitializeParticleCreator(particleCreator);
     143
     144      evaluatorPlaceholder.Name = "(Evaluator)";
     145      evaluatorPlaceholder.OperatorParameter.ActualName = "Evaluator";
     146      evaluatorPlaceholder.Successor = bestPersonalQualityAssigner;
     147
     148      bestPersonalQualityAssigner.LeftSideParameter.ActualName = "PersonalBestQuality";
     149      bestPersonalQualityAssigner.RightSideParameter.ActualName = "Quality";
     150
     151      bestPositionInitializer.Successor = analyzerPlaceholder;
     152
     153      analyzerPlaceholder.Name = "(Analyzer)";
     154      analyzerPlaceholder.OperatorParameter.ActualName = "Analyzer";
     155      analyzerPlaceholder.Successor = uniformSubScopeProcessor;
     156
     157      uniformSubScopeProcessor.Operator = particleUpdater;
     158      uniformSubScopeProcessor.Successor = analyzerPlaceholder2;
     159
     160      particleUpdater.Successor = evaluatorPlaceholder2;
     161
     162      evaluatorPlaceholder2.Name = "(Evaluator)";
     163      evaluatorPlaceholder2.OperatorParameter.ActualName = "Evaluator";
     164      evaluatorPlaceholder2.Successor = swarmUpdater;
     165
     166      analyzerPlaceholder2.Name = "(Analyzer)";
     167      analyzerPlaceholder2.OperatorParameter.ActualName = "Analyzer";
     168      analyzerPlaceholder2.Successor = currentIterationCounter;
     169
     170      currentIterationCounter.Name = "CurrentIteration++";
     171      currentIterationCounter.ValueParameter.ActualName = "CurrentIteration";
     172      currentIterationCounter.Successor = currentIterationComparator;
     173
     174      currentIterationComparator.LeftSideParameter.ActualName = "CurrentIteration";
     175      currentIterationComparator.Comparison = new Comparison(ComparisonType.Less);
     176      currentIterationComparator.RightSideParameter.ActualName = "MaxIterations";
     177      currentIterationComparator.ResultParameter.ActualName = "ContinueIteration";
     178      currentIterationComparator.Successor = conditionalBranch;
     179
     180      conditionalBranch.Name = "ContinueIteration?";
     181      conditionalBranch.ConditionParameter.ActualName = "ContinueIteration";
     182      conditionalBranch.TrueBranch = uniformSubScopeProcessor;
     183
    181184      InitializeAnalyzers();
    182185      UpdateAnalyzers();
    183       Initialize();
    184     }
    185 
    186     [StorableHook(HookType.AfterDeserialization)]
    187     private void Initialize() {
    188       EncoderParameter.ValueChanged += new EventHandler(EncoderParameter_ValueChanged);
    189       if (Problem != null) {
    190         bestLocalQualityInitalizer.RightSideParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
    191       }
    192     }
    193 
    194     [StorableConstructor]
    195     private ParticleSwarmOptimization(bool deserializing) : base(deserializing) { }
     186    }
     187
     188    private static void InitializeParticleCreator(CombinedOperator particleCreator) {
     189      Placeholder positionCreator = new Placeholder();
     190      Assigner personalBestPositionAssigner = new Assigner();
     191      UniformRandomRealVectorCreator velocityCreator = new UniformRandomRealVectorCreator();
     192
     193      particleCreator.Name = "Particle Creator";
     194      particleCreator.OperatorGraph.InitialOperator = positionCreator;
     195
     196      positionCreator.Name = "(SolutionCreator)";
     197      positionCreator.OperatorParameter.ActualName = "SolutionCreator";
     198      positionCreator.Successor = personalBestPositionAssigner;
     199
     200      personalBestPositionAssigner.LeftSideParameter.ActualName = "PersonalBestPoint";
     201      personalBestPositionAssigner.RightSideParameter.ActualName = "Point";
     202      personalBestPositionAssigner.Successor = velocityCreator;
     203
     204      velocityCreator.LengthParameter.ActualName = "ProblemSize";
     205      velocityCreator.BoundsParameter.ActualName = "VelocityBounds";
     206      velocityCreator.RealVectorParameter.ActualName = "Velocity";
     207    }
    196208
    197209    public override IDeepCloneable Clone(Cloner cloner) {
    198       ParticleSwarmOptimization clone = (ParticleSwarmOptimization)base.Clone(cloner);
    199       clone.Initialize();
    200       return clone;
     210      return new ParticleSwarmOptimization(this, cloner);
    201211    }
    202212
     
    207217    #region Events
    208218    protected override void OnProblemChanged() {
    209       UpdateEncoders();
    210219      UpdateAnalyzers();
    211220      ParameterizeAnalyzers();
    212       bestLocalQualityInitalizer.RightSideParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;
    213221      Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged);
    214       MainLoop.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;
    215222      base.OnProblemChanged();
    216223    }
    217224
    218     private void EncoderParameter_ValueChanged(object sender, EventArgs e) {
    219       //MainLoop.EncoderParameter.ActualValue = (IRealVectorEncoder) EncoderParameter.ActualValue;
    220       //((UniformSubScopesProcessor)((VariableCreator)((SolutionsCreator)((RandomCreator)OperatorGraph.InitialOperator).Successor).Successor).Successor).Operator = EncoderParameter.Value;
    221       //((SingleSuccessorOperator)EncoderParameter.Value).Successor = ((SingleSuccessorOperator)old).Successor;
    222     }
    223225    #endregion
    224226
    225227    #region Helpers
    226228    private void Evaluator_QualityParameter_ActualNameChanged(object sender, EventArgs e) {
    227       //
    228       //
    229     }
    230 
    231     private void UpdateEncoders() {
    232       IRealVectorEncoder oldEncoder = EncoderParameter.Value;
    233       EncoderParameter.ValidValues.Clear();
    234       List<IRealVectorEncoder> encoders = Problem.Operators.OfType<IRealVectorEncoder>().OrderBy(x => x.Name).ToList<IRealVectorEncoder>();
    235       if (encoders.Count > 0) {  // ToDo: Add wiring; else: use Position Vector directly --> name matching
    236         foreach (IRealVectorEncoder encoder in Problem.Operators.OfType<IRealVectorEncoder>().OrderBy(x => x.Name)) {
    237           EncoderParameter.ValidValues.Add(encoder);
    238           ((ILookupParameter)encoder.RealVectorParameter).ActualName = "Position";
    239         }
    240         if (oldEncoder != null) {
    241           IRealVectorEncoder encoder = EncoderParameter.ValidValues.FirstOrDefault(x => x.GetType() == oldEncoder.GetType());
    242           if (encoder != null) EncoderParameter.Value = encoder;
    243         }
    244       }
    245229    }
    246230
     
    251235
    252236    private void ParameterizeAnalyzers() {
    253       qualityAnalyzer.ResultsParameter.ActualName = "Results";
    254237      if (Problem != null) {
    255238        qualityAnalyzer.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
Note: See TracChangeset for help on using the changeset viewer.