Free cookie consent management tool by TermsFeed Policy Generator

source: branches/PTSP/HeuristicLab.Problems.PTSP/3.3/EstimatedPTSP.cs @ 12693

Last change on this file since 12693 was 12387, checked in by apolidur, 10 years ago

#2221: Fixing RealizationsSize parameter not updating

File size: 7.3 KB
Line 
1using System.Text;
2using System.Threading.Tasks;
3using HeuristicLab.Optimization;
4using HeuristicLab.PluginInfrastructure;
5using HeuristicLab.Core;
6using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
7using HeuristicLab.Problems.Instances;
8using HeuristicLab.Encodings.PermutationEncoding;
9using HeuristicLab.Common;
10using HeuristicLab.Parameters;
11using HeuristicLab.Data;
12using HeuristicLab.Random;
13using System;
14using System.Linq;
15
16namespace HeuristicLab.Problems.PTSP {
17  [Item("Estimated Probabilistic Traveling Salesman Problem", "Represents an estimated Probabilistic Traveling Salesman Problem.")]
18  [Creatable("Problems")]
19  [StorableClass]
20  public sealed class EstimatedProbabilisticTravelingSalesmanProblem : ProbabilisticTravelingSalesmanProblem, IStorableContent,
21  IProblemInstanceConsumer<PTSPData> {
22
23
24    #region Parameter Properties
25    public ValueParameter<ItemList<ItemList<IntValue>>> RealizationsParameter {
26      get { return (ValueParameter<ItemList<ItemList<IntValue>>>)Parameters["Realizations"]; }
27    }
28    public ValueParameter<IntValue> RealizationsSizeParameter {
29      get { return (ValueParameter<IntValue>)Parameters["RealizationsSize"]; }
30    }
31
32    #endregion
33
34    #region Properties
35    public ItemList<ItemList<IntValue>> Realizations {
36      get { return RealizationsParameter.Value; }
37      set { RealizationsParameter.Value = value; }
38    }
39
40    public IntValue RealizationsSize {
41      get { return RealizationsSizeParameter.Value; }
42      set { RealizationsSizeParameter.Value = value; }
43    }
44    #endregion
45
46    [StorableConstructor]
47    private EstimatedProbabilisticTravelingSalesmanProblem(bool deserializing) : base(deserializing) { }
48    private EstimatedProbabilisticTravelingSalesmanProblem(EstimatedProbabilisticTravelingSalesmanProblem original, Cloner cloner)
49      : base(original, cloner) {
50      RegisterEventHandlers();
51    }
52    public EstimatedProbabilisticTravelingSalesmanProblem() {
53      Parameters.Add(new ValueParameter<IntValue>("RealizationsSize", "Size of the sample for the estimation-based evaluation"));
54      Parameters.Add(new ValueParameter<ItemList<ItemList<IntValue>>>("Realizations", "The concrete..."));
55      Operators.Add(new PTSPEstimatedInversionEvaluator());
56      Operators.Add(new PTSPEstimatedInsertionEvaluator());
57      Operators.Add(new PTSPExhaustiveInversionLocalImprovement());
58      Operators.Add(new PTSPExhaustiveInsertionLocalImprovement());
59
60      Operators.Add(new Exhaustive25MoveGenerator());
61      Operators.Add(new Stochastic25MultiMoveGenerator());
62      Operators.Add(new Stochastic25SingleMoveGenerator());
63      Operators.Add(new TwoPointFiveMoveMaker());
64      Operators.Add(new PTSP25MoveEvaluator());
65
66      Encoding.ConfigureOperators(Operators.OfType<IOperator>());
67      foreach (var twopointfiveMoveOperator in Operators.OfType<I25MoveOperator>()) {
68        twopointfiveMoveOperator.TwoPointFiveMoveParameter.ActualName = "Permutation.TwoPointFiveMove";
69      }
70      RealizationsSize = new IntValue(100);
71      RegisterEventHandlers();
72    }
73
74    public override IDeepCloneable Clone(Cloner cloner) {
75      return new EstimatedProbabilisticTravelingSalesmanProblem(this, cloner);
76    }
77
78    public override double Evaluate(Individual individual, IRandom random) {
79      Permutation p = individual.Permutation();
80      // Estimation-based evaluation
81      MersenneTwister r = new MersenneTwister();
82      double estimatedSum = 0;
83      for (int i = 0; i < Realizations.Count; i++) {
84        int singleRealization = -1, firstNode = -1;
85        for (int j = 0; j < Realizations[i].Count; j++) {
86          if (Realizations[i][p[j]].Value == 1) {
87            if (singleRealization != -1) {
88              estimatedSum += DistanceMatrix[singleRealization, p[j]];
89            } else {
90              firstNode = p[j];
91            }
92            singleRealization = p[j];
93          }
94        }
95        if (singleRealization != -1) {
96          estimatedSum += DistanceMatrix[singleRealization, firstNode];
97        }
98      }
99      return estimatedSum / RealizationsSize.Value;
100    }
101
102    public double[] EvaluateWithParams(DistanceMatrix distances, DoubleArray probabilities, ItemList<ItemList<IntValue>> realizations, Permutation individual ) {
103      // Estimation-based evaluation
104      MersenneTwister r = new MersenneTwister();
105      double estimatedSum = 0;
106      double[] partialSums = new double[realizations.Count];
107      for (int i = 0; i < realizations.Count; i++) {
108        partialSums[i] = 0;
109        int singleRealization = -1, firstNode = -1;
110        for (int j = 0; j < realizations[i].Count; j++) {
111          if (realizations[i][individual[j]].Value == 1) {
112            if (singleRealization != -1) {
113              partialSums[i] += distances[singleRealization, individual[j]];
114            } else {
115              firstNode = individual[j];
116            }
117            singleRealization = individual[j];
118          }
119        }
120        if (singleRealization != -1) {
121          partialSums[i] += distances[singleRealization, firstNode];
122        }
123        estimatedSum += partialSums[i];
124      }
125      double mean = estimatedSum / realizations.Count;
126      double variance = 0;
127      for (int i = 0; i < realizations.Count; i++) {
128        variance += Math.Pow((partialSums[i] - mean), 2);
129      }
130      variance = variance / realizations.Count;
131      return new double[] {mean,variance};
132    }
133
134   
135
136    private void RegisterEventHandlers() {
137      //RealizationsSizeParameter.ValueChanged += new EventHandler(RealizationsSizeParameter_ValueChanged);
138      RealizationsSize.ValueChanged += new EventHandler(RealizationsSizeParameter_ValueChanged);
139      //RealizationsSizeParameter.Value.ValueChanged += new EventHandler(RealizationsSizeParameter_ValueChanged);
140    }
141
142    private void RealizationsSizeParameter_ValueChanged(object sender, EventArgs e) {
143      UpdateRealizations();
144    }
145
146    private void UpdateRealizations() {
147      MersenneTwister r = new MersenneTwister();
148      int countOnes = 0;
149      Realizations = new ItemList<ItemList<IntValue>>(RealizationsSize.Value);
150      for (int i = 0; i < RealizationsSize.Value; i++) {
151        ItemList<IntValue> newRealization = new ItemList<IntValue>();
152        while (countOnes < 4) { //only generate realizations with at least 4 cities visited
153          countOnes = 0;
154          newRealization.Clear();
155          for (int j = 0; j < DistanceMatrix.Rows; j++) {
156            if (ProbabilityMatrix[j] > r.NextDouble()) {
157              newRealization.Add(new IntValue(1));
158              countOnes++;
159            } else {
160              newRealization.Add(new IntValue(0));
161            }
162          }
163        }
164        countOnes = 0;
165        Realizations.Add(newRealization);
166      }
167    }
168
169    public override void Load(PTSPData data) {
170      base.Load(data);
171      UpdateRealizations();
172
173      foreach (var op in Operators.OfType<PTSPMoveEvaluator>()) {
174        op.RealizationsParameter.Value = Realizations;
175      }
176      foreach (var op in Operators.OfType<PTSPExhaustiveInversionLocalImprovement>()) {
177        op.RealizationsParameter.Value = Realizations;
178      }
179      foreach (var op in Operators.OfType<PTSP25MoveEvaluator>()) {
180        op.RealizationsParameter.Value = Realizations;
181      }
182
183    }
184  }
185}
Note: See TracBrowser for help on using the repository browser.