Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
07/10/17 17:26:43 (7 years ago)
Author:
abeham
Message:

#2797:

  • Added IStochasticOperator interface to MultiPSOTopologyUpdater
  • Changed parameter defaults to those described in the paper
  • Added analyzer placeholder for the last iteration (has not been previously analyzed)
  • Changed random topology initializer to include itself (to be able to use it with SPSOSwarmUpdater -> this should not change the old RealVectorSwarmUpdater)
  • Changed ring topology initializer to include itself (same as above)
  • Changed von neumann topology initializer to include itself (same as above)
  • Added SPSO compatible random topology initializer (as described in the paper by Clerc)
  • Changed sampling of the random directional vector to be uniformly random on the surface of a hypersphere to avoid a slight bias in diagonal direction
  • Updating SwarmBestQuality and BestRealVector parameters in SPSOSwarmUpdater (an oversight)
  • Added a faster method to create a copy of a RealVector (based on Array.Copy)
  • Updated the sample
  • Updated the sample's test results (due to changed sampling in SPSO2011ParticleUpdater)
File:
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/SPSORandomTopologyInitializer.cs

    r15167 r15181  
    3030
    3131namespace HeuristicLab.Algorithms.ParticleSwarmOptimization {
    32   [Item("Random Topology Initializer", "Randomly connectes every particle with k other particles.")]
     32  [Item("SPSO Random Topology Initializer", "Each particle informs k+1 other particles (including itself). The same particle (including itself) can be informed multiple times.")]
    3333  [StorableClass]
    34   public sealed class RandomTopologyInitializer : TopologyInitializer, IStochasticOperator {
     34  public sealed class SPSORandomTopologyInitializer : TopologyInitializer, IStochasticOperator {
    3535    #region Parameters
    3636    public ILookupParameter<IRandom> RandomParameter {
    3737      get { return (ILookupParameter<IRandom>)Parameters["Random"]; }
    3838    }
    39     public IValueLookupParameter<IntValue> NrOfConnectionsParameter {
    40       get { return (IValueLookupParameter<IntValue>)Parameters["NrOfConnections"]; }
     39    public IValueLookupParameter<IntValue> KParameter {
     40      get { return (IValueLookupParameter<IntValue>)Parameters["K"]; }
    4141    }
    4242    #endregion
     
    4444    #region Construction & Cloning
    4545    [StorableConstructor]
    46     private RandomTopologyInitializer(bool deserializing) : base(deserializing) { }
    47     private RandomTopologyInitializer(RandomTopologyInitializer original, Cloner cloner) : base(original, cloner) { }
    48     public RandomTopologyInitializer() {
     46    private SPSORandomTopologyInitializer(bool deserializing) : base(deserializing) { }
     47    private SPSORandomTopologyInitializer(SPSORandomTopologyInitializer original, Cloner cloner) : base(original, cloner) { }
     48    public SPSORandomTopologyInitializer() {
    4949      Parameters.Add(new LookupParameter<IRandom>("Random", "A random number generation."));
    50       Parameters.Add(new ValueLookupParameter<IntValue>("NrOfConnections", "Nr of connected neighbors.", new IntValue(3)));
     50      Parameters.Add(new ValueLookupParameter<IntValue>("K", "The number of informed particles (excluding itself).", new IntValue(3)));
    5151    }
    5252
    5353    public override IDeepCloneable Clone(Cloner cloner) {
    54       return new RandomTopologyInitializer(this, cloner);
     54      return new SPSORandomTopologyInitializer(this, cloner);
    5555    }
    5656    #endregion
     
    5959      var random = RandomParameter.ActualValue;
    6060      var swarmSize = SwarmSizeParameter.ActualValue.Value;
    61       var nrOfConnections = NrOfConnectionsParameter.ActualValue.Value;
     61      var k = KParameter.ActualValue.Value;
    6262
    63       ItemArray<IntArray> neighbors = new ItemArray<IntArray>(swarmSize);
     63      // SPSO: Each particle informs at most K+1 particles (at least itself and K others)
     64      var particlesInform = Enumerable.Repeat(k + 1, swarmSize)
     65        .Select((v, i) => new HashSet<int>(Enumerable.Range(0, v).Select(x => x == 0 ? i : random.Next(swarmSize)))).ToList();
     66
     67      var neighbors = new ItemArray<IntArray>(swarmSize);
    6468      for (int i = 0; i < swarmSize; i++) {
    65         var numbers = Enumerable.Range(0, swarmSize).ToList();
    66         numbers.RemoveAt(i);
    67         var selectedNumbers = new List<int>(nrOfConnections);
    68         for (int j = 0; j < nrOfConnections && numbers.Count > 0; j++) {
    69           int index = random.Next(numbers.Count);
    70           selectedNumbers.Add(numbers[index]);
    71           numbers.RemoveAt(index);
    72         }
    73         neighbors[i] = new IntArray(selectedNumbers.ToArray());
     69        // calculate the informants for each particle
     70        var informants = particlesInform.Select((val, idx) => val.Contains(i) ? idx : -1).Where(x => x >= 0).ToArray();
     71        neighbors[i] = new IntArray(informants);
    7472      }
    7573      NeighborsParameter.ActualValue = neighbors;
Note: See TracChangeset for help on using the changeset viewer.