Changeset 5033 for branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleSwarmOptimization.cs
- Timestamp:
- 12/06/10 14:45:27 (13 years ago)
- 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 3 3 obj 4 4 *.user 5 *.suo
-
- Property svn:ignore
-
branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleSwarmOptimization.cs
r4068 r5033 21 21 22 22 using System; 23 using System.Collections.Generic;24 23 using System.Linq; 25 24 using HeuristicLab.Analysis; … … 36 35 37 36 namespace HeuristicLab.Algorithms.ParticleSwarmOptimization { 37 38 38 [Item("Particle Swarm Optimization", "A particle swarm optimization algorithm.")] 39 39 [Creatable("Algorithms")] 40 40 [StorableClass] 41 public sealed class ParticleSwarmOptimization : EngineAlgorithm { 41 public class ParticleSwarmOptimization : EngineAlgorithm { 42 42 43 #region Problem Properties 43 44 public override Type ProblemType { … … 48 49 set { base.Problem = value; } 49 50 } 50 public IRealVectorEncoder Encoder {51 get { return EncoderParameter.Value; }52 set { EncoderParameter.Value = value; }53 }54 51 public MultiAnalyzer Analyzer { 55 52 get { return AnalyzerParameter.Value; } … … 59 56 60 57 #region Parameter Properties 61 p rivateValueParameter<IntValue> SeedParameter {58 public ValueParameter<IntValue> SeedParameter { 62 59 get { return (ValueParameter<IntValue>)Parameters["Seed"]; } 63 60 } 64 p rivateValueParameter<BoolValue> SetSeedRandomlyParameter {61 public ValueParameter<BoolValue> SetSeedRandomlyParameter { 65 62 get { return (ValueParameter<BoolValue>)Parameters["SetSeedRandomly"]; } 66 63 } 67 p rivateValueParameter<IntValue> SwarmSizeParameter {64 public ValueParameter<IntValue> SwarmSizeParameter { 68 65 get { return (ValueParameter<IntValue>)Parameters["SwarmSize"]; } 69 66 } 70 p rivateValueParameter<IntValue> MaxIterationsParameter {67 public ValueParameter<IntValue> MaxIterationsParameter { 71 68 get { return (ValueParameter<IntValue>)Parameters["MaxIterations"]; } 72 69 } 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 { 77 80 get { return (ValueParameter<MultiAnalyzer>)Parameters["Analyzer"]; } 81 } 82 public ValueLookupParameter<DoubleMatrix> VelocityBoundsParameter { 83 get { return (ValueLookupParameter<DoubleMatrix>)Parameters["VelocityBounds"]; } 78 84 } 79 85 #endregion … … 81 87 #region Properties 82 88 [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]93 89 private BestAverageWorstQualityAnalyzer qualityAnalyzer; 94 90 #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 } 95 98 96 99 public ParticleSwarmOptimization() … … 100 103 Parameters.Add(new ValueParameter<IntValue>("SwarmSize", "Size of the particle swarm.", new IntValue(10))); 101 104 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."));103 105 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 104 111 RandomCreator randomCreator = new RandomCreator(); 112 VariableCreator variableCreator = new VariableCreator(); 105 113 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; 129 131 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 181 184 InitializeAnalyzers(); 182 185 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 } 196 208 197 209 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); 201 211 } 202 212 … … 207 217 #region Events 208 218 protected override void OnProblemChanged() { 209 UpdateEncoders();210 219 UpdateAnalyzers(); 211 220 ParameterizeAnalyzers(); 212 bestLocalQualityInitalizer.RightSideParameter.ActualName = Problem.Evaluator.QualityParameter.ActualName;213 221 Problem.Evaluator.QualityParameter.ActualNameChanged += new EventHandler(Evaluator_QualityParameter_ActualNameChanged); 214 MainLoop.EvaluatorParameter.ActualName = Problem.EvaluatorParameter.Name;215 222 base.OnProblemChanged(); 216 223 } 217 224 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 }223 225 #endregion 224 226 225 227 #region Helpers 226 228 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 matching236 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 }245 229 } 246 230 … … 251 235 252 236 private void ParameterizeAnalyzers() { 253 qualityAnalyzer.ResultsParameter.ActualName = "Results";254 237 if (Problem != null) { 255 238 qualityAnalyzer.MaximizationParameter.ActualName = Problem.MaximizationParameter.Name;
Note: See TracChangeset
for help on using the changeset viewer.