Changeset 15181 for trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/SPSORandomTopologyInitializer.cs
- Timestamp:
- 07/10/17 17:26:43 (7 years ago)
- File:
-
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Algorithms.ParticleSwarmOptimization/3.3/SPSORandomTopologyInitializer.cs
r15167 r15181 30 30 31 31 namespace 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.")] 33 33 [StorableClass] 34 public sealed class RandomTopologyInitializer : TopologyInitializer, IStochasticOperator {34 public sealed class SPSORandomTopologyInitializer : TopologyInitializer, IStochasticOperator { 35 35 #region Parameters 36 36 public ILookupParameter<IRandom> RandomParameter { 37 37 get { return (ILookupParameter<IRandom>)Parameters["Random"]; } 38 38 } 39 public IValueLookupParameter<IntValue> NrOfConnectionsParameter {40 get { return (IValueLookupParameter<IntValue>)Parameters[" NrOfConnections"]; }39 public IValueLookupParameter<IntValue> KParameter { 40 get { return (IValueLookupParameter<IntValue>)Parameters["K"]; } 41 41 } 42 42 #endregion … … 44 44 #region Construction & Cloning 45 45 [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() { 49 49 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))); 51 51 } 52 52 53 53 public override IDeepCloneable Clone(Cloner cloner) { 54 return new RandomTopologyInitializer(this, cloner);54 return new SPSORandomTopologyInitializer(this, cloner); 55 55 } 56 56 #endregion … … 59 59 var random = RandomParameter.ActualValue; 60 60 var swarmSize = SwarmSizeParameter.ActualValue.Value; 61 var nrOfConnections = NrOfConnectionsParameter.ActualValue.Value;61 var k = KParameter.ActualValue.Value; 62 62 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); 64 68 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); 74 72 } 75 73 NeighborsParameter.ActualValue = neighbors;
Note: See TracChangeset
for help on using the changeset viewer.