Index: /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/HeuristicLab.Algorithms.ParticleSwarmOptimization-3.3.csproj
===================================================================
--- /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/HeuristicLab.Algorithms.ParticleSwarmOptimization-3.3.csproj	(revision 5224)
+++ /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/HeuristicLab.Algorithms.ParticleSwarmOptimization-3.3.csproj	(revision 5225)
@@ -110,4 +110,6 @@
   <ItemGroup>
     <Compile Include="BestPointInitializer.cs" />
+    <Compile Include="WeightedValueModifierSelector.cs" />
+    <Compile Include="ValueModifierSelector.cs" />
     <Compile Include="RandomTopologyInitializer.cs" />
     <Compile Include="VonNeumannTopologyInitializer.cs" />
Index: /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleSwarmOptimization.cs
===================================================================
--- /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleSwarmOptimization.cs	(revision 5224)
+++ /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ParticleSwarmOptimization.cs	(revision 5225)
@@ -54,4 +54,12 @@
       set { AnalyzerParameter.Value = value; }
     }
+    public ValueModifierSelector OmegaUpdater {
+      get { return OmegaUpdaterParameter.Value; }
+      set { OmegaUpdaterParameter.Value = value; }
+    }
+    public WeightedValueModifierSelector VelocityBoundsUpdater {
+      get { return VelocityBoundsUpdaterParameter.Value; }
+      set { VelocityBoundsUpdaterParameter.Value = value; }
+    }
     #endregion
 
@@ -93,4 +101,10 @@
       get { return (ConstrainedValueParameter<ITopologyUpdater>)Parameters["TopologyUpdater"]; }
     }
+    public ValueParameter<WeightedValueModifierSelector> VelocityBoundsUpdaterParameter {
+      get { return (ValueParameter<WeightedValueModifierSelector>)Parameters["VelocityBoundsUpdater"]; }
+    }
+    public ValueParameter<ValueModifierSelector> OmegaUpdaterParameter {
+      get { return (ValueParameter<ValueModifierSelector>)Parameters["OmegaUpdater"]; }
+    }
     #endregion
 
@@ -98,4 +112,7 @@
     [Storable]
     private BestAverageWorstQualityAnalyzer qualityAnalyzer;
+
+    //[Storable]
+    //private IDiscreteDoubleValueModifier omegaModifier;
     #endregion
 
@@ -105,4 +122,5 @@
       : base(original, cloner) {
       qualityAnalyzer = cloner.Clone(original.qualityAnalyzer);
+      //omegaModifier = cloner.Clone(original.omegaModifier);
     }
 
@@ -124,7 +142,10 @@
       Parameters.Add(new ConstrainedValueParameter<ITopologyUpdater>("TopologyUpdater", "Updates the neighborhood description vectors",
         new ItemSet<ITopologyUpdater>(ApplicationManager.Manager.GetInstances<ITopologyUpdater>())));
+      //Parameters.Add(new ValueParameter<MultiParameterUpdater>("ParameterUpdater", "Updates the algorithm parameters according to some strategy",
+      //  new MultiParameterUpdater()));
+      Parameters.Add(new ValueParameter<ValueModifierSelector>("OmegaUpdater", "Updates the omega parameter", new ValueModifierSelector())); 
+      Parameters.Add(new ValueParameter<WeightedValueModifierSelector>("VelocityBoundsUpdater", "Adjusts the velocity bounds", new WeightedValueModifierSelector())); 
       ParticleUpdaterParameter.ActualValue = ParticleUpdaterParameter.ValidValues.SingleOrDefault(v => v.GetType() == typeof(TotallyConnectedParticleUpdater));
       TopologyInitializerParameter.ActualValue = TopologyInitializerParameter.ValidValues.SingleOrDefault(v => v.GetType() == typeof(EmptyTopologyInitializer));
-      TopologyUpdaterParameter.ActualValue = TopologyUpdaterParameter.ValidValues.SingleOrDefault(v => v.GetType() == typeof(IdentityTopologyUpdater));
 
       RandomCreator randomCreator = new RandomCreator();
@@ -149,4 +170,6 @@
       Comparator currentIterationComparator = new Comparator();
       ConditionalBranch conditionalBranch = new ConditionalBranch();
+      Placeholder velocityBoundsUpdaterPlaceholder = new Placeholder();
+      Placeholder omegaUpdaterPlaceholder = new Placeholder();
 
       OperatorGraph.InitialOperator = randomCreator;
@@ -210,5 +233,13 @@
       currentIterationCounter.Name = "CurrentIteration++";
       currentIterationCounter.ValueParameter.ActualName = "CurrentIteration";
-      currentIterationCounter.Successor = currentIterationComparator;
+      currentIterationCounter.Successor = omegaUpdaterPlaceholder;
+
+      omegaUpdaterPlaceholder.Name = "(Omega Updater)";
+      omegaUpdaterPlaceholder.OperatorParameter.ActualName = "OmegaUpdater";
+      omegaUpdaterPlaceholder.Successor = velocityBoundsUpdaterPlaceholder;
+
+      velocityBoundsUpdaterPlaceholder.Name = "(Velocity Bounds Updater)";
+      velocityBoundsUpdaterPlaceholder.OperatorParameter.ActualName = "VelocityBoundsUpdater";
+      velocityBoundsUpdaterPlaceholder.Successor = currentIterationComparator;
 
       currentIterationComparator.LeftSideParameter.ActualName = "CurrentIteration";
@@ -223,4 +254,5 @@
 
       InitializeAnalyzers();
+      InitializeUpdaters(); 
       UpdateAnalyzers();
     }
@@ -275,4 +307,27 @@
       qualityAnalyzer = new BestAverageWorstQualityAnalyzer();
       ParameterizeAnalyzers();
+    }
+
+    private void InitializeUpdaters() {
+      OmegaUpdater.ValueParameter.ActualName = OmegaParameter.Name;
+      foreach (IDiscreteDoubleValueModifier op in ApplicationManager.Manager.GetInstances<IDiscreteDoubleValueModifier>()) {
+        OmegaUpdater.ModifierParameter.ValidValues.Add(op);
+        op.EndIndexParameter.ActualName = MaxIterationsParameter.Name;
+        op.StartIndexParameter.Value = new IntValue(0);
+        op.IndexParameter.ActualName = "CurrentIteration";
+        op.ValueParameter.ActualName = OmegaUpdater.ValueParameter.ActualName;
+        op.StartValueParameter.Value = new DoubleValue(OmegaParameter.Value.Value);
+        op.EndValueParameter.Value = new DoubleValue(-2);
+      }
+      VelocityBoundsUpdater.ValueParameter.ActualName = VelocityBoundsParameter.Name;
+      foreach (IDiscreteDoubleValueModifier op in ApplicationManager.Manager.GetInstances<IDiscreteDoubleValueModifier>()) {
+        VelocityBoundsUpdater.ModifierParameter.ValidValues.Add(op);
+        op.EndIndexParameter.ActualName = MaxIterationsParameter.Name;
+        op.StartIndexParameter.Value = new IntValue(0);
+        op.IndexParameter.ActualName = "CurrentIteration";
+        op.ValueParameter.ActualName = VelocityBoundsUpdater.ScaleParameter.Name;
+        op.StartValueParameter.Value = new DoubleValue(VelocityBoundsUpdater.ScaleParameter.Value.Value);
+        op.EndValueParameter.Value = new DoubleValue(0);
+        }
     }
 
Index: /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ValueModifierSelector.cs
===================================================================
--- /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ValueModifierSelector.cs	(revision 5225)
+++ /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/ValueModifierSelector.cs	(revision 5225)
@@ -0,0 +1,47 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Operators;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
+  public class ValueModifierSelector : SingleSuccessorOperator {
+    public ILookupParameter<Item> ValueParameter {
+      get { return (ILookupParameter<Item>)Parameters["Value"]; }
+    }
+
+    public ConstrainedValueParameter<IOperator> ModifierParameter {
+      get { return (ConstrainedValueParameter<IOperator>)Parameters["Modifier"]; }
+    }
+
+    public ValueModifierSelector() : base() {
+      Parameters.Add(new LookupParameter<Item>("Value", "The double value to modify."));
+      Parameters.Add(new ConstrainedValueParameter<IOperator>("Modifier", "Modifies the value", new ItemSet<IOperator>()));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ValueModifierSelector(this, cloner);
+    }
+
+    protected ValueModifierSelector(ValueModifierSelector original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    [StorableConstructor]
+    protected ValueModifierSelector(bool deserializing) : base(deserializing) { }
+
+    public override IOperation Apply() {
+      OperationCollection next = new OperationCollection();
+      next.Add(ExecutionContext.CreateOperation(this.ModifierParameter.Value));
+      next.Add(base.Apply());
+      return next;
+    }
+  }
+}
Index: /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/WeightedValueModifierSelector.cs
===================================================================
--- /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/WeightedValueModifierSelector.cs	(revision 5225)
+++ /branches/PSO/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/WeightedValueModifierSelector.cs	(revision 5225)
@@ -0,0 +1,58 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Operators;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Parameters;
+using HeuristicLab.Common;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
+  public class WeightedValueModifierSelector : SingleSuccessorOperator {
+    public IValueParameter<DoubleValue> ScaleParameter {
+      get { return (IValueParameter<DoubleValue>)Parameters["Scale"]; }
+    }
+
+    public ILookupParameter<DoubleMatrix> ValueParameter {
+      get { return (ILookupParameter<DoubleMatrix>)Parameters["Matrix"]; }
+    }
+
+    public ConstrainedValueParameter<IOperator> ModifierParameter {
+      get { return (ConstrainedValueParameter<IOperator>)Parameters["Modifier"]; }
+    }
+
+    public WeightedValueModifierSelector() : base() {
+      Parameters.Add(new LookupParameter<DoubleMatrix>("Matrix", "The double matrix to scale."));
+      Parameters.Add(new ValueParameter<DoubleValue>("Scale", "The double value to modify.", new DoubleValue(1)));
+      Parameters.Add(new ConstrainedValueParameter<IOperator>("Modifier", "Modifies the value", new ItemSet<IOperator>()));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new WeightedValueModifierSelector(this, cloner);
+    }
+
+    protected WeightedValueModifierSelector(WeightedValueModifierSelector original, Cloner cloner)
+      : base(original, cloner) {
+    }
+
+    [StorableConstructor]
+    protected WeightedValueModifierSelector(bool deserializing) : base(deserializing) { }
+
+    public override IOperation Apply() {
+      OperationCollection next = new OperationCollection();
+      DoubleMatrix matrix = ValueParameter.ActualValue;
+      for (int i = 0; i < matrix.Rows; i++) {
+        for (int j = 0; j < matrix.Columns; j++) {
+          ValueParameter.ActualValue[i, j] *= ScaleParameter.Value.Value;
+        }
+      }
+      next.Add(ExecutionContext.CreateChildOperation(this.ModifierParameter.Value));
+      next.Add(base.Apply());
+      return next;
+    }
+  }
+}
