Free cookie consent management tool by TermsFeed Policy Generator

source: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Crossover/AlternationCrossover.cs @ 15289

Last change on this file since 15289 was 15289, checked in by pkimmesw, 7 years ago

#2665 Fixed analyzer, fixed Plush encoding + operators, adpated print evaluation according to McPhee

File size: 5.1 KB
Line 
1namespace HeuristicLab.Problems.ProgramSynthesis.Push.Crossover {
2  using System;
3  using System.Linq;
4
5  using HeuristicLab.Common;
6  using HeuristicLab.Core;
7  using HeuristicLab.Data;
8  using HeuristicLab.Operators;
9  using HeuristicLab.Optimization;
10  using HeuristicLab.Parameters;
11  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
12  using HeuristicLab.Problems.ProgramSynthesis.Base.Extensions;
13  using HeuristicLab.Problems.ProgramSynthesis.Push.Encoding;
14  using HeuristicLab.Random;
15
16  /// <summary>
17  /// Alternation crossover for plush vectors.
18  /// </summary>
19  [Item("AlternationCrossover", "Alternation crossover for plush vectors.")]
20  [StorableClass]
21  public class AlternationCrossover : InstrumentedOperator, IPlushCrossover, IStochasticOperator {
22    private const double Mean = 0.0;
23
24    public AlternationCrossover() {
25      Parameters.Add(new LookupParameter<IRandom>("Random", "The pseudo random number generator which should be used for stochastic crossover operators."));
26
27      Parameters.Add(new ScopeTreeLookupParameter<PlushVector>("Parents", "The parent vectors which should be crossed."));
28      ParentsParameter.ActualName = "PlushVector";
29
30      Parameters.Add(new LookupParameter<PlushVector>("Child", "The child vector resulting from the crossover."));
31      ChildParameter.ActualName = "PlushVector";
32
33      Parameters.Add(new FixedValueParameter<PercentValue>("AlternationRate", "Specifies the probability of switching to another parent.", new PercentValue(0.5)));
34      Parameters.Add(new FixedValueParameter<DoubleValue>("AlignmentDeviation", "When alternating between parents, the index at which to continue copying may be offset backward or forward some amount based on a random sample from a normal distribution with mean 0 and standard deviation set by the alignment deviation parameter", new DoubleValue(1.0)));
35      Parameters.Add(new FixedValueParameter<IntValue>("MaxLength", "The max length of a children", new IntValue(100)));
36    }
37
38    [StorableConstructor]
39    public AlternationCrossover(bool deserializing) : base(deserializing) {
40    }
41
42    public AlternationCrossover(AlternationCrossover origin, Cloner cloner) : base(origin, cloner) {
43    }
44
45    public override IDeepCloneable Clone(Cloner cloner) {
46      return new AlternationCrossover(this, cloner);
47    }
48
49    public IValueParameter<IntValue> MaxLengthParameter
50    {
51      get { return (IValueParameter<IntValue>)Parameters["MaxLength"]; }
52    }
53
54    public int MaxLength
55    {
56      get { return MaxLengthParameter.Value.Value; }
57      set { MaxLengthParameter.Value.Value = value; }
58    }
59
60    public IValueParameter<PercentValue> AlternationRateParameter
61    {
62      get { return (IValueParameter<PercentValue>)Parameters["AlternationRate"]; }
63    }
64
65    public double AlternationRate
66    {
67      get { return AlternationRateParameter.Value.Value; }
68      set { AlternationRateParameter.Value.Value = value; }
69    }
70
71    public IValueParameter<DoubleValue> AlignmentDeviationParameter
72    {
73      get { return (IValueParameter<DoubleValue>)Parameters["AlignmentDeviation"]; }
74    }
75
76    public double AlignmentDeviation
77    {
78      get { return AlignmentDeviationParameter.Value.Value; }
79      set { AlignmentDeviationParameter.Value.Value = value; }
80    }
81
82    public ILookupParameter<IRandom> RandomParameter
83    {
84      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
85    }
86    public ILookupParameter<ItemArray<PlushVector>> ParentsParameter
87    {
88      get { return (ScopeTreeLookupParameter<PlushVector>)Parameters["Parents"]; }
89    }
90    public ILookupParameter<PlushVector> ChildParameter
91    {
92      get { return (ILookupParameter<PlushVector>)Parameters["Child"]; }
93    }
94
95    public sealed override IOperation InstrumentedApply() {
96      ChildParameter.ActualValue = Cross(
97        RandomParameter.ActualValue,
98        ParentsParameter.ActualValue,
99        AlternationRate,
100        MaxLength,
101        AlignmentDeviation);
102      return base.InstrumentedApply();
103    }
104
105    private static PlushVector Cross(
106      IRandom random,
107      ItemArray<PlushVector> parents,
108      double alternationRate,
109      int maxChildLength,
110      double alignmentDeviation) {
111      var normalDistributedRandom = new NormalDistributedRandom(random, Mean, alignmentDeviation);
112      var maxLength = parents.Max(p => p.Entries.Count);
113      var parentIndex = random.Next(0, 2);
114      var parent = parents[parentIndex];
115      var child = new PlushVector(maxLength);
116
117      for (var i = 0; i < maxLength && child.Entries.Count <= maxChildLength; i++) {
118
119        // if parent is shorter than the other, then ignore those entries
120        if (i < parent.Entries.Count)
121          child.Add(parent[i]);
122
123        // switch parent?
124        if (random.NextDouble() < alternationRate) {
125          parentIndex = parentIndex == 0 ? 1 : 0;
126          parent = parents[parentIndex];
127          i += normalDistributedRandom.NextRounded();
128          i = Math.Max(i, 0);
129        }
130      }
131
132      return child;
133    }
134  }
135}
Note: See TracBrowser for help on using the repository browser.