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)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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}
Note: See TracChangeset for help on using the changeset viewer.