Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
02/28/11 17:25:28 (13 years ago)
Author:
epitzer
Message:

Continue working on SwarmUpdater (#852)

Location:
trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/Interfaces/IRealVectorParticleUpdater.cs

    r5560 r5568  
    3131    ILookupParameter<DoubleMatrix> BoundsParameter { get; }
    3232    ILookupParameter<RealVector> PersonalBestParameter { get; }
    33     ILookupParameter<RealVector> NeighborsBestParameter { get; }
     33    ILookupParameter<RealVector> NeighborBestParameter { get; }
    3434  }
    3535}
  • trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/Interfaces/IRealVectorSwarmUpdater.cs

    r5561 r5568  
    2525namespace HeuristicLab.Encodings.RealVectorEncoding {
    2626  public interface IRealVectorSwarmUpdater : ISwarmUpdater, IRealVectorOperator {
    27     IScopeTreeLookupParameter<RealVector> NeighborsBestParameter { get; }
     27    IScopeTreeLookupParameter<RealVector> NeighborBestParameter { get; }
    2828    IScopeTreeLookupParameter<RealVector> PersonalBestParameter { get; }
    2929    IScopeTreeLookupParameter<RealVector> RealVectorParameter { get; }
  • trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/ParticleOperators/RealVectorNeighborhoodParticleUpdater.cs

    r5560 r5568  
    2222using HeuristicLab.Common;
    2323using HeuristicLab.Core;
    24 using HeuristicLab.Encodings.RealVectorEncoding;
     24using HeuristicLab.Optimization;
    2525using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    26 using HeuristicLab.Optimization;
    2726
    2827namespace HeuristicLab.Encodings.RealVectorEncoding {
     
    4746      double omega = Inertia.Value;
    4847      double phi_p = PersonalBestAttraction.Value;
    49       double phi_g = NeighborsBestAttraction.Value;
     48      double phi_g = NeighborBestAttraction.Value;
    5049      for (int i = 0; i < velocity.Length; i++) {
    5150        velocity[i] =
    5251          Velocity[i] * omega +
    5352          (PersonalBest[i] - RealVector[i]) * phi_p * r_p +
    54           (NeighborsBest[i] - RealVector[i]) * phi_g * r_g;
     53          (BestPoint[i] - RealVector[i]) * phi_g * r_g;
    5554      }
    5655      BoundsChecker.Apply(velocity, VelocityBounds);
  • trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/ParticleOperators/RealVectorParticleUpdater.cs

    r5566 r5568  
    4545      get { return (ILookupParameter<RealVector>)Parameters["PersonalBest"]; }
    4646    }
    47     public ILookupParameter<RealVector> NeighborsBestParameter {
    48       get { return (ILookupParameter<RealVector>)Parameters["NeighborsBest"]; }
     47    public ILookupParameter<RealVector> NeighborBestParameter {
     48      get { return (ILookupParameter<RealVector>)Parameters["NeighborBest"]; }
     49    }
     50    public LookupParameter<RealVector> BestPointParameter {
     51      get { return (LookupParameter<RealVector>)Parameters["BestPoint"]; }
    4952    }
    5053    public ILookupParameter<RealVector> RealVectorParameter {
     
    6366      get { return (ILookupParameter<DoubleValue>)Parameters["PersonalBestAttraction"]; }
    6467    }
    65     public ILookupParameter<DoubleValue> NeighborsBestAttractionParameter {
    66       get { return (ILookupParameter<DoubleValue>)Parameters["NeighborsBestAttraction"]; }
     68    public ILookupParameter<DoubleValue> NeighborBestAttractionParameter {
     69      get { return (ILookupParameter<DoubleValue>)Parameters["NeighborBestAttraction"]; }
    6770    }
    6871    #endregion
     
    7982      get { return PersonalBestParameter.ActualValue; }
    8083    }
     84    protected RealVector BestPoint {
     85      get { return BestPointParameter.ActualValue; }
     86    }
    8187    protected RealVector RealVector {
    8288      get { return RealVectorParameter.ActualValue; }
    8389      set { RealVectorParameter.ActualValue = value; }
    8490    }
    85     protected RealVector NeighborsBest {
    86       get { return NeighborsBestParameter.ActualValue; }
     91    protected RealVector NeighborBest {
     92      get { return NeighborBestParameter.ActualValue; }
    8793    }
    8894    protected DoubleMatrix Bounds {
     
    98104      get { return PersonalBestAttractionParameter.ActualValue; }
    99105    }
    100     protected DoubleValue NeighborsBestAttraction {
    101       get { return NeighborsBestAttractionParameter.ActualValue; }
     106    protected DoubleValue NeighborBestAttraction {
     107      get { return NeighborBestAttractionParameter.ActualValue; }
    102108    }
    103109    #endregion
     
    108114    protected RealVectorParticleUpdater(bool deserializing) : base(deserializing) { }
    109115    protected RealVectorParticleUpdater(RealVectorParticleUpdater original, Cloner cloner) : base(original, cloner) { }
    110    
     116
    111117    public RealVectorParticleUpdater()
    112118      : base() {
     
    116122      Parameters.Add(new LookupParameter<RealVector>("PersonalBest", "Particle's personal best solution."));
    117123      Parameters.Add(new LookupParameter<RealVector>("BestPoint", "Global best position."));
    118       Parameters.Add(new LookupParameter<RealVector>("NeighborsBest", "Best neighboring solution."));
     124      Parameters.Add(new LookupParameter<RealVector>("NeighborBest", "Best neighboring solution."));
    119125      Parameters.Add(new LookupParameter<DoubleMatrix>("Bounds", "The lower and upper bounds for each dimension of the position vector for the current problem."));
    120126      Parameters.Add(new LookupParameter<DoubleMatrix>("VelocityBounds", "Upper and lower bounds for the particle's velocity vector."));
    121127      Parameters.Add(new LookupParameter<DoubleValue>("Inertia", "The weight for the particle's velocity vector."));
    122128      Parameters.Add(new LookupParameter<DoubleValue>("PersonalBestAttraction", "The weight for the particle's personal best position."));
    123       Parameters.Add(new LookupParameter<DoubleValue>("NeighborsBestAttraction", "The weight for the global best position."));
     129      Parameters.Add(new LookupParameter<DoubleValue>("NeighborBestAttraction", "The weight for the global best position."));
    124130    }
    125131
  • trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/ParticleOperators/RealVectorSwarmUpdater.cs

    r5566 r5568  
    2525using HeuristicLab.Data;
    2626using HeuristicLab.Operators;
     27using HeuristicLab.Optimization;
    2728using HeuristicLab.Parameters;
    2829using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
     
    4344      get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["PersonalBestQuality"]; }
    4445    }
    45     public IScopeTreeLookupParameter<DoubleValue> NeighborsBestQualityParameter {
    46       get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["NeighborsBestQuality"]; }
     46    public IScopeTreeLookupParameter<DoubleValue> NeighborBestQualityParameter {
     47      get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["NeighborBestQuality"]; }
    4748    }
    4849    public IScopeTreeLookupParameter<RealVector> RealVectorParameter {
     
    5253      get { return (IScopeTreeLookupParameter<RealVector>)Parameters["PersonalBest"]; }
    5354    }
    54     public IScopeTreeLookupParameter<RealVector> NeighborsBestParameter {
    55       get { return (IScopeTreeLookupParameter<RealVector>)Parameters["NeighborsBest"]; }
    56     }
    57     public IValueLookupParameter<BoolValue> MaximizationParameter {
    58       get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
     55    public IScopeTreeLookupParameter<RealVector> NeighborBestParameter {
     56      get { return (IScopeTreeLookupParameter<RealVector>)Parameters["NeighborBest"]; }
     57    }
     58    public ILookupParameter<BoolValue> MaximizationParameter {
     59      get { return (ILookupParameter<BoolValue>)Parameters["Maximization"]; }
    5960    }
    6061    public ILookupParameter<DoubleValue> BestQualityParameter {
     
    6667    public IScopeTreeLookupParameter<IntArray> NeighborsParameter {
    6768      get { return (IScopeTreeLookupParameter<IntArray>)Parameters["Neighbors"]; }
     69    }
     70    public ValueLookupParameter<IDiscreteDoubleMatrixModifier> VelocityBoundsUpdaterParameter {
     71      get { return (ValueLookupParameter<IDiscreteDoubleMatrixModifier>)Parameters["VelocityBoundsUpdater"]; }
     72    }
     73    public LookupParameter<DoubleMatrix> VelocityBoundsParameter {
     74      get { return (LookupParameter<DoubleMatrix>)Parameters["VelocityBounds"]; }
    6875    }
    6976    #endregion
     
    8289    private ItemArray<DoubleValue> PersonalBestQuality {
    8390      get { return PersonalBestQualityParameter.ActualValue; }
    84     }
    85     private ItemArray<DoubleValue> NeighborsBestQuality {
    86       get { return NeighborsBestQualityParameter.ActualValue; }
     91      set { PersonalBestQualityParameter.ActualValue = value; }
     92    }
     93    private ItemArray<DoubleValue> NeighborBestQuality {
     94      get { return NeighborBestQualityParameter.ActualValue; }
     95      set { NeighborBestQualityParameter.ActualValue = value; }
    8796    }
    8897    private ItemArray<RealVector> RealVector {
     
    93102      set { PersonalBestParameter.ActualValue = value; }
    94103    }
    95     private ItemArray<RealVector> NeighborsBest {
    96       get { return NeighborsBestParameter.ActualValue; }
    97       set { NeighborsBestParameter.ActualValue = value; }
     104    private ItemArray<RealVector> NeighborBest {
     105      get { return NeighborBestParameter.ActualValue; }
     106      set { NeighborBestParameter.ActualValue = value; }
    98107    }
    99108    private bool Maximization {
     
    102111    private ItemArray<IntArray> Neighbors {
    103112      get { return NeighborsParameter.ActualValue; }
     113    }
     114    private IDiscreteDoubleMatrixModifier VelocityBoundsUpdater {
     115      get { return VelocityBoundsUpdaterParameter.ActualValue; }
     116    }
     117    private DoubleMatrix VelocityBounds {
     118      get { return VelocityBoundsParameter.ActualValue; }
     119      set { VelocityBoundsParameter.ActualValue = value; }
    104120    }
    105121    #endregion
     
    116132      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "Particle's quality"));
    117133      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("PersonalBestQuality", "Particle's personal best quality"));
    118       Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("NeighborsBestQuality", "Global best particle quality"));
     134      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("NeighborBestQuality", "Global best particle quality"));
    119135      Parameters.Add(new ScopeTreeLookupParameter<RealVector>("RealVector", "Particle's position"));
    120136      Parameters.Add(new ScopeTreeLookupParameter<RealVector>("PersonalBest", "Particle's personal best position"));
    121       Parameters.Add(new ScopeTreeLookupParameter<RealVector>("NeighborsBest", "Neighborhood (or global in case of totally connected neighborhood) best particle position"));
     137      Parameters.Add(new ScopeTreeLookupParameter<RealVector>("NeighborBest", "Neighborhood (or global in case of totally connected neighborhood) best particle position"));
    122138      Parameters.Add(new ScopeTreeLookupParameter<IntArray>("Neighbors", "The list of neighbors for each particle."));
    123       Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, otherwise false."));
     139      Parameters.Add(new LookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, otherwise false."));
     140      Parameters.Add(new ValueLookupParameter<IDiscreteDoubleMatrixModifier>("VelocityBoundsUpdater", "Modifies the velocity bounds in the course of optimization."));
     141      Parameters.Add(new LookupParameter<DoubleMatrix>("VelocityBounds", "Maximum velocity for each dimension."));
    124142    }
    125143
     
    132150    public override IOperation Apply() {
    133151      InitializeBestPoint();
     152      UpdateNeighbors();
    134153      UpdateSwarm();
    135       UpdateNeighbors();
    136       UpdateVelocityBounds();
    137       return base.Apply();
     154      if (VelocityBoundsUpdater != null) {
     155        var ops = new OperationCollection();
     156        ops.Add(ExecutionContext.CreateChildOperation(VelocityBoundsUpdater));
     157        ops.Add(ExecutionContext.CreateOperation(Successor));
     158        return ops;
     159      } else {
     160        return base.Apply();
     161      }
    138162    }
    139163
     
    148172    private void UpdateNeighbors() {
    149173      if (Neighbors != null & Neighbors.Length > 0) {
    150         if (this.NeighborsBest == null || NeighborsBest.Length != Neighbors.Length)
    151           NeighborsBest = new ItemArray<RealVector>(Neighbors.Length);
     174        if (this.NeighborBest == null || NeighborBest.Length != Neighbors.Length)
     175          NeighborBest = new ItemArray<RealVector>(Neighbors.Length);
    152176        for (int n = 0; n < Neighbors.Length; n++) {
    153177          var pairs = Quality.Zip(RealVector, (q, p) => new { Quality = q, Point = p })
    154178            .Where((p, i) => i == n || Neighbors[n].Contains(i));
    155           NeighborsBest[n] = Maximization ?
     179          NeighborBest[n] = Maximization ?
    156180          pairs.OrderByDescending(p => p.Quality.Value).First().Point :
    157181          pairs.OrderBy(p => p.Quality.Value).First().Point;
    158182        }
    159         NeighborsBestParameter.ActualValue = NeighborsBest;
    160       }
    161     }
    162 
    163     private void UpdateVelocityBounds() {
    164       // ToDo: Add code
     183        NeighborBestParameter.ActualValue = NeighborBest;
     184      }
    165185    }
    166186
    167187    private void UpdateSwarm() {
    168188      if (PersonalBestQuality.Length == 0) {
    169         ItemArray<DoubleValue> personalBestQualities = new ItemArray<DoubleValue>(RealVector.Length);
    170         for (int i = 0; i < RealVector.Length; i++) {
    171           if (Maximization) {
    172             personalBestQualities[i] = new DoubleValue(double.MinValue);
    173           } else {
    174             personalBestQualities[i] = new DoubleValue(double.MaxValue);
    175           }
    176         }
    177         PersonalBestQualityParameter.ActualValue = personalBestQualities;
    178       }
    179       if (NeighborsBestQuality.Length == 0) {
    180         if (NeighborsParameter != null && Neighbors.Length > 0) {
    181           ItemArray<DoubleValue> neighborsBestQualities = new ItemArray<DoubleValue>(RealVector.Length);
    182           for (int i = 0; i < RealVector.Length; i++) {
    183             if (Maximization) {
    184               neighborsBestQualities[i] = new DoubleValue(double.MinValue);
    185             } else {
    186               neighborsBestQualities[i] = new DoubleValue(double.MaxValue);
    187             }
    188           }
    189           NeighborsBestQualityParameter.ActualValue = neighborsBestQualities;
    190         }
    191       }
    192       ItemArray<RealVector> neighborsBest = new ItemArray<RealVector>(RealVector.Length);
     189        PersonalBestQuality = (ItemArray<DoubleValue>)Quality.Clone();
     190        if (VelocityBounds == null)
     191          VelocityBounds = new DoubleMatrix(new double[,] { { -1, 1 } });
     192      }
    193193      for (int i = 0; i < RealVector.Length; i++) {
    194194        if (Maximization && Quality[i].Value > PersonalBestQuality[i].Value ||
     
    196196          PersonalBestQuality[i].Value = Quality[i].Value;
    197197          PersonalBest[i] = RealVector[i];
    198           if (Maximization && PersonalBestQuality[i].Value > NeighborsBestQuality[i].Value ||
    199              !Maximization && PersonalBestQuality[i].Value < NeighborsBestQuality[i].Value) {
    200             NeighborsBestQuality[i].Value = PersonalBestQuality[i].Value;
    201             neighborsBest[i] = PersonalBest[i];
     198        }
     199      }
     200      if (Neighbors.Length > 0) {
     201        var neighborBestQuality = NeighborBestQuality;
     202        var neighborBest = NeighborBest;
     203        if (NeighborBestQuality.Length == 0) {
     204          neighborBestQuality = (ItemArray<DoubleValue>)Quality.Clone();
     205          neighborBest = (ItemArray<RealVector>)RealVector.Clone();
     206        }
     207        for (int i = 0; i < RealVector.Length; i++) {
     208          if (Maximization && PersonalBestQuality[i].Value > NeighborBestQuality[i].Value ||
     209             !Maximization && PersonalBestQuality[i].Value < NeighborBestQuality[i].Value) {
     210            neighborBestQuality[i].Value = PersonalBestQuality[i].Value;
     211            neighborBest[i] = PersonalBest[i];
    202212          }
    203213        }
    204       }
    205       if (NeighborsParameter != null && Neighbors.Length > 0) {
    206         NeighborsBestParameter.ActualValue = neighborsBest;
    207       }
    208     }
    209 
     214        NeighborBestQuality = neighborBestQuality;
     215        NeighborBest = neighborBest;
     216      }
     217    }
    210218  }
    211219}
  • trunk/sources/HeuristicLab.Encodings.RealVectorEncoding/3.3/ParticleOperators/RealVectorTotallyConnectedParticleUpdater.cs

    r5560 r5568  
    2222using HeuristicLab.Common;
    2323using HeuristicLab.Core;
     24using HeuristicLab.Optimization;
    2425using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    25 using HeuristicLab.Optimization;
    2626
    2727namespace HeuristicLab.Encodings.RealVectorEncoding {
     
    5151      double omega = Inertia.Value;
    5252      double phi_p = PersonalBestAttraction.Value;
    53       double phi_g = NeighborsBestAttraction.Value;
     53      double phi_g = NeighborBestAttraction.Value;
    5454      for (int i = 0; i < velocity.Length; i++) {
    5555        velocity[i] =
    5656          Velocity[i] * omega +
    5757          (PersonalBest[i] - RealVector[i]) * phi_p * r_p +
    58           (NeighborsBest[i] - RealVector[i]) * phi_g * r_g;
     58          (BestPoint[i] - RealVector[i]) * phi_g * r_g;
    5959      }
    6060      BoundsChecker.Apply(velocity, VelocityBounds);
Note: See TracChangeset for help on using the changeset viewer.