Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Problems.VehicleRouting/3.4/Analyzer/ConstraintRelaxation/Capacitated/CapacityRelaxationVRPAnalyzer.cs @ 12962

Last change on this file since 12962 was 12488, checked in by pfleck, 10 years ago

#2400

  • Interfaces for Capaciated-, PickupAndDelivery- and TimeWindowed-ProblemInstances now specify an additional penalty parameter to set the current penalty factor for the constraint relaxation.
  • The setter of the penalty-property in the ProblemInstances is removed.
  • A CurrentPenalty property is added for setting the adapted penalty value from the relaxation analyzers. These properties are explicitly implemented to "hide" the setter from the API, so that it wont be used unaware of the relaxation mechanics.
  • Hide the CurrentPenaltyParameters for same reasons to avoid setting it unwarily.
  • Added additional infos in the error message off the VRPInstances unit-test.
File size: 6.9 KB
RevLine 
[6711]1#region License Information
2/* HeuristicLab
[12012]3 * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
[6711]4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
[8053]22using HeuristicLab.Common;
[6711]23using HeuristicLab.Core;
[8053]24using HeuristicLab.Data;
[6711]25using HeuristicLab.Operators;
26using HeuristicLab.Optimization;
[8053]27using HeuristicLab.Parameters;
28using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
29using HeuristicLab.Problems.VehicleRouting.Interfaces;
[6711]30using HeuristicLab.Problems.VehicleRouting.Variants;
31
32namespace HeuristicLab.Problems.VehicleRouting {
33  /// <summary>
34  /// An operator for adaptive constraint relaxation.
35  /// </summary>
36  [Item("CapacityRelaxationVRPAnalyzer", "An operator for adaptively relaxing the capacity constraints.")]
37  [StorableClass]
[11970]38  public class CapacityRelaxationVRPAnalyzer : SingleSuccessorOperator, IAnalyzer, ICapacitatedOperator, ISingleObjectiveOperator {
[6711]39    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
40      get { return (ILookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
41    }
42    public ScopeTreeLookupParameter<IVRPEncoding> VRPToursParameter {
43      get { return (ScopeTreeLookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
44    }
45    public ScopeTreeLookupParameter<DoubleValue> QualityParameter {
46      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
47    }
48
49    public ScopeTreeLookupParameter<DoubleValue> OverloadParameter {
50      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["Overload"]; }
51    }
52
53    public IValueParameter<DoubleValue> SigmaParameter {
54      get { return (IValueParameter<DoubleValue>)Parameters["Sigma"]; }
55    }
56    public IValueParameter<DoubleValue> PhiParameter {
57      get { return (IValueParameter<DoubleValue>)Parameters["Phi"]; }
58    }
59    public IValueParameter<DoubleValue> MinPenaltyFactorParameter {
60      get { return (IValueParameter<DoubleValue>)Parameters["MinPenaltyFactor"]; }
61    }
[8497]62    public IValueParameter<DoubleValue> MaxPenaltyFactorParameter {
63      get { return (IValueParameter<DoubleValue>)Parameters["MaxPenaltyFactor"]; }
64    }
[6711]65
66    public ValueLookupParameter<ResultCollection> ResultsParameter {
67      get { return (ValueLookupParameter<ResultCollection>)Parameters["Results"]; }
68    }
69
[7175]70    public bool EnabledByDefault {
71      get { return false; }
72    }
73
[6711]74    [StorableConstructor]
[7906]75    protected CapacityRelaxationVRPAnalyzer(bool deserializing) : base(deserializing) { }
[6711]76
77    public CapacityRelaxationVRPAnalyzer()
78      : base() {
79      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The problem instance."));
80      Parameters.Add(new ScopeTreeLookupParameter<IVRPEncoding>("VRPTours", "The VRP tours which should be evaluated."));
81      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The qualities of the VRP solutions which should be analyzed."));
82
83      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Overload", "The overloads of the VRP solutions which should be analyzed."));
84
[8497]85      Parameters.Add(new ValueParameter<DoubleValue>("Sigma", "The sigma applied to the penalty factor.", new DoubleValue(0.5)));
86      Parameters.Add(new ValueParameter<DoubleValue>("Phi", "The phi applied to the penalty factor.", new DoubleValue(0.5)));
[6711]87      Parameters.Add(new ValueParameter<DoubleValue>("MinPenaltyFactor", "The minimum penalty factor.", new DoubleValue(0.01)));
[8497]88      Parameters.Add(new ValueParameter<DoubleValue>("MaxPenaltyFactor", "The maximum penalty factor.", new DoubleValue(100000)));
[6711]89
90      Parameters.Add(new ValueLookupParameter<ResultCollection>("Results", "The result collection where the best VRP solution should be stored."));
91    }
92
93    public override IDeepCloneable Clone(Cloner cloner) {
94      return new CapacityRelaxationVRPAnalyzer(this, cloner);
95    }
96
[7906]97    protected CapacityRelaxationVRPAnalyzer(CapacityRelaxationVRPAnalyzer original, Cloner cloner)
[6711]98      : base(original, cloner) {
99    }
100
[8497]101    [StorableHook(HookType.AfterDeserialization)]
102    private void AfterDeserialization() {
103      // BackwardsCompatibility3.3
104      #region Backwards compatible code, remove with 3.4
105      if (!Parameters.ContainsKey("MaxPenaltyFactor")) {
106        Parameters.Add(new ValueParameter<DoubleValue>("MaxPenaltyFactor", "The maximum penalty factor.", new DoubleValue(100000)));
107      }
108      #endregion
109    }
110
[6711]111    public override IOperation Apply() {
112      ICapacitatedProblemInstance cvrp = ProblemInstanceParameter.ActualValue as ICapacitatedProblemInstance;
113      ResultCollection results = ResultsParameter.ActualValue;
[8053]114
[6711]115      ItemArray<DoubleValue> qualities = QualityParameter.ActualValue;
116      ItemArray<DoubleValue> overloads = OverloadParameter.ActualValue;
[8053]117
[6711]118      double sigma = SigmaParameter.Value.Value;
119      double phi = PhiParameter.Value.Value;
120      double minPenalty = MinPenaltyFactorParameter.Value.Value;
[8497]121      double maxPenalty = MaxPenaltyFactorParameter.Value.Value;
[6711]122
123      for (int j = 0; j < qualities.Length; j++) {
124        qualities[j].Value -= overloads[j].Value * cvrp.OverloadPenalty.Value;
125      }
126
127      int validCount = 0;
128      for (int j = 0; j < qualities.Length; j++) {
129        if (overloads[j].Value == 0)
130          validCount++;
131      }
132
133      double factor = 1.0 - ((double)validCount / (double)qualities.Length);
134
135      double min = cvrp.OverloadPenalty.Value / (1 + sigma);
136      double max = cvrp.OverloadPenalty.Value * (1 + phi);
137
[12488]138      cvrp.CurrentOverloadPenalty = new DoubleValue(min + (max - min) * factor);
139      if (cvrp.CurrentOverloadPenalty.Value < minPenalty)
140        cvrp.CurrentOverloadPenalty.Value = minPenalty;
141      if (cvrp.CurrentOverloadPenalty.Value > maxPenalty)
142        cvrp.CurrentOverloadPenalty.Value = maxPenalty;
[6711]143
144      for (int j = 0; j < qualities.Length; j++) {
[12488]145        qualities[j].Value += overloads[j].Value * cvrp.CurrentOverloadPenalty.Value;
[6711]146      }
147
148      if (!results.ContainsKey("Current Overload Penalty")) {
[12488]149        results.Add(new Result("Current Overload Penalty", new DoubleValue(cvrp.CurrentOverloadPenalty.Value)));
[6711]150      } else {
[12488]151        (results["Current Overload Penalty"].Value as DoubleValue).Value = cvrp.CurrentOverloadPenalty.Value;
[6711]152      }
153
154      return base.Apply();
155    }
156  }
157}
Note: See TracBrowser for help on using the repository browser.