Free cookie consent management tool by TermsFeed Policy Generator

source: branches/DynamicVehicleRouting/HeuristicLab.PDPSimulation/3.3/Operators/Moves/Rearrange/PotvinPDRearrangeMoveTabuCriterion.cs @ 8670

Last change on this file since 8670 was 8670, checked in by svonolfe, 12 years ago

Added first version of the dynamic vehicle routing addon (#1955)

File size: 7.6 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
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
22using HeuristicLab.Common;
23using HeuristicLab.Core;
24using HeuristicLab.Data;
25using HeuristicLab.Operators;
26using HeuristicLab.Optimization;
27using HeuristicLab.Parameters;
28using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
29using HeuristicLab.Problems.VehicleRouting.Interfaces;
30using HeuristicLab.Problems.VehicleRouting.Variants;
31using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
32
33namespace HeuristicLab.PDPSimulation.Operators {
34  [Item("DynPotvinPDRearrangeTabuCriterion", @"Checks if a certain rearrange move is tabu.")]
35  [StorableClass]
36  public class DynPotvinPDRearrangeTabuCriterion : SingleSuccessorOperator, IDynPotvinPDRearrangeMoveOperator, ITabuChecker, IPotvinOperator, IVRPMoveOperator {
37    public override bool CanChangeName {
38      get { return false; }
39    }
40
41    public ILookupParameter<DynPotvinPDRearrangeMove> PDRearrangeMoveParameter {
42      get { return (ILookupParameter<DynPotvinPDRearrangeMove>)Parameters["DynPotvinPDRearrangeMove"]; }
43    }
44    public ILookupParameter VRPMoveParameter {
45      get { return PDRearrangeMoveParameter; }
46    }
47    public ILookupParameter<IVRPEncoding> VRPToursParameter {
48      get { return (ILookupParameter<IVRPEncoding>)Parameters["VRPTours"]; }
49    }
50    public ILookupParameter<IVRPProblemInstance> ProblemInstanceParameter {
51      get { return (LookupParameter<IVRPProblemInstance>)Parameters["ProblemInstance"]; }
52    } 
53
54    public ILookupParameter<ItemList<IItem>> TabuListParameter {
55      get { return (ILookupParameter<ItemList<IItem>>)Parameters["TabuList"]; }
56    }
57    public ILookupParameter<BoolValue> MoveTabuParameter {
58      get { return (ILookupParameter<BoolValue>)Parameters["MoveTabu"]; }
59    }
60    public IValueLookupParameter<BoolValue> MaximizationParameter {
61      get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
62    }
63    public ILookupParameter<DoubleValue> MoveQualityParameter {
64      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
65    }
66    public ValueParameter<BoolValue> UseAspirationCriterionParameter {
67      get { return (ValueParameter<BoolValue>)Parameters["UseAspirationCriterion"]; }
68    }
69
70    public ILookupParameter<DoubleValue> MoveDistanceParameter {
71      get { return (ILookupParameter<DoubleValue>)Parameters["MoveDistance"]; }
72    }
73    public ILookupParameter<DoubleValue> MoveOverloadParameter {
74      get { return (ILookupParameter<DoubleValue>)Parameters["MoveOverload"]; }
75    }
76    public ILookupParameter<DoubleValue> MoveTardinessParameter {
77      get { return (ILookupParameter<DoubleValue>)Parameters["MoveTardiness"]; }
78    }
79
80    public BoolValue UseAspirationCriterion {
81      get { return UseAspirationCriterionParameter.Value; }
82      set { UseAspirationCriterionParameter.Value = value; }
83    }
84
85    [StorableConstructor]
86    protected DynPotvinPDRearrangeTabuCriterion(bool deserializing) : base(deserializing) { }
87    protected DynPotvinPDRearrangeTabuCriterion(DynPotvinPDRearrangeTabuCriterion original, Cloner cloner) : base(original, cloner) { }
88    public DynPotvinPDRearrangeTabuCriterion()
89      : base() {
90      Parameters.Add(new LookupParameter<DynPotvinPDRearrangeMove>("DynPotvinPDRearrangeMove", "The moves that should be made."));
91      Parameters.Add(new LookupParameter<IVRPEncoding>("VRPTours", "The VRP tours considered in the move."));
92      Parameters.Add(new LookupParameter<IVRPProblemInstance>("ProblemInstance", "The VRP problem instance"));
93
94      Parameters.Add(new LookupParameter<BoolValue>("MoveTabu", "The variable to store if a move was tabu."));
95      Parameters.Add(new LookupParameter<ItemList<IItem>>("TabuList", "The tabu list."));
96      Parameters.Add(new ValueParameter<BoolValue>("UseAspirationCriterion", "Whether to use the aspiration criterion or not.", new BoolValue(true)));
97      Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, else if it is a minimization problem."));
98      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", "The quality of the current move."));
99
100      Parameters.Add(new LookupParameter<DoubleValue>("MoveDistance", "The distance of the move"));
101      Parameters.Add(new LookupParameter<DoubleValue>("MoveOverload", "The overload of the move"));
102      Parameters.Add(new LookupParameter<DoubleValue>("MoveTardiness", "The tardiness of the move"));
103    }
104
105    public override IDeepCloneable Clone(Cloner cloner) {
106      return new DynPotvinPDRearrangeTabuCriterion(this, cloner);
107    }
108
109    public override IOperation Apply() {
110      ItemList<IItem> tabuList = TabuListParameter.ActualValue;
111      double moveQuality = MoveQualityParameter.ActualValue.Value;
112      bool useAspiration = UseAspirationCriterion.Value;
113      bool isTabu = false;
114      DynPotvinPDRearrangeMove move = PDRearrangeMoveParameter.ActualValue;
115
116      foreach (IItem tabuMove in tabuList) {
117        DynPotvinPDRelocateMoveAttribute attribute = tabuMove as DynPotvinPDRelocateMoveAttribute;
118
119        if (attribute != null) {
120          double distance = 0;
121          if (MoveDistanceParameter.ActualValue != null)
122            distance = MoveDistanceParameter.ActualValue.Value;
123
124          double overload = 0;
125          if (MoveOverloadParameter.ActualValue != null)
126            overload = MoveOverloadParameter.ActualValue.Value;
127
128          double tardiness = 0;
129          if (MoveTardinessParameter.ActualValue != null)
130            tardiness = MoveTardinessParameter.ActualValue.Value;
131
132          IVRPProblemInstance instance = ProblemInstanceParameter.ActualValue;
133          double quality = attribute.Distance * instance.DistanceFactor.Value;
134
135          IHomogenousCapacitatedProblemInstance cvrp = instance as IHomogenousCapacitatedProblemInstance;
136          if (cvrp != null)
137            quality += attribute.Overload * cvrp.OverloadPenalty.Value;
138
139          ITimeWindowedProblemInstance vrptw = instance as ITimeWindowedProblemInstance;
140          if (vrptw != null)
141            quality += attribute.Tardiness * vrptw.TardinessPenalty.Value;
142
143          IPickupAndDeliveryProblemInstance pdp = instance as IPickupAndDeliveryProblemInstance;
144          if (pdp != null)
145            quality += attribute.PickupViolations * pdp.PickupViolationPenalty.Value;
146
147          if (!useAspiration || moveQuality >= quality) {
148            if (attribute.City == move.City && attribute.Tour == move.Tour) {
149              isTabu = true;
150              break;
151            }
152
153            if (attribute.Distance == distance && attribute.Overload == overload && attribute.Tardiness == tardiness) {
154              isTabu = true;
155              break;
156            }
157          }
158        }
159      }
160     
161      MoveTabuParameter.ActualValue = new BoolValue(isTabu);
162      return base.Apply();
163    }
164  }
165}
Note: See TracBrowser for help on using the repository browser.