Free cookie consent management tool by TermsFeed Policy Generator

source: branches/DynamicVehicleRouting/HeuristicLab.PDPSimulation/3.3/Operators/Moves/Exchange/PotvinPDExchangeExhaustiveMoveGenerator.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: 3.9 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 System;
23using HeuristicLab.Core;
24using HeuristicLab.Optimization;
25using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
26using HeuristicLab.Parameters;
27using System.Collections.Generic;
28using HeuristicLab.Problems.VehicleRouting.Interfaces;
29using HeuristicLab.Common;
30using HeuristicLab.Problems.VehicleRouting.Variants;
31using HeuristicLab.Problems.VehicleRouting.Encodings.Potvin;
32
33namespace HeuristicLab.PDPSimulation.Operators {
34  [Item("DynPotvinPDExchangeExhaustiveMoveGenerator", "Generates exchange moves from a given PDP encoding.")]
35  [StorableClass]
36  public sealed class DynPotvinPDExchangeExhaustiveMoveGenerator : DynPotvinPDExchangeMoveGenerator, IExhaustiveMoveGenerator {
37    public override IDeepCloneable Clone(Cloner cloner) {
38      return new DynPotvinPDExchangeExhaustiveMoveGenerator(this, cloner);
39    }
40
41    [StorableConstructor]
42    private DynPotvinPDExchangeExhaustiveMoveGenerator(bool deserializing) : base(deserializing) { }
43
44    public DynPotvinPDExchangeExhaustiveMoveGenerator()
45      : base() {
46    }
47
48    private DynPotvinPDExchangeExhaustiveMoveGenerator(DynPotvinPDExchangeExhaustiveMoveGenerator original, Cloner cloner)
49      : base(original, cloner) {
50    }
51
52    protected override DynPotvinPDExchangeMove[] GenerateMoves(PotvinEncoding individual, IVRPProblemInstance problemInstance) {
53      List<DynPotvinPDExchangeMove> result = new List<DynPotvinPDExchangeMove>();
54      IPickupAndDeliveryProblemInstance pdp = problemInstance as IPickupAndDeliveryProblemInstance;
55
56      int max = individual.Tours.Count;
57      if (individual.Tours.Count < problemInstance.Vehicles.Value)
58        max = max - 1;
59
60      for (int i = 0; i < individual.Tours.Count; i++) {
61        for (int j = 0; j < individual.Tours[i].Stops.Count; j++) {
62          for (int k = 0; k <= max; k++) {
63            if (k != i) {
64              int city1 = individual.Tours[i].Stops[j];
65              if (pdp == null || pdp.GetDemand(city1) >= 0 || pdp.GetPickupDeliveryLocation(city1) <= 0 || pdp.GetPickupDeliveryLocation(city1) == city1) {
66                for (int l = 0; l < individual.Tours[k].Stops.Count; l++) {
67                  int city2 = individual.Tours[k].Stops[l];
68                  if (pdp == null || pdp.GetDemand(city2) >= 0 || pdp.GetPickupDeliveryLocation(city2) <= 0) {
69                    bool valid = pdp == null || pdp.GetPickupDeliveryLocation(city1) <= 0 || pdp.GetPickupDeliveryLocation(city1) == city1 ||
70                      (pdp.GetPickupDeliveryLocation(city2) != pdp.GetPickupDeliveryLocation(city1) &&
71                       pdp.GetPickupDeliveryLocation(city2) != city1 &&
72                       pdp.GetPickupDeliveryLocation(city1) != city2);
73
74                    if (valid) {
75                      DynPotvinPDExchangeMove move = new DynPotvinPDExchangeMove(
76                        city1, i, k, city2, individual);
77
78                      result.Add(move);
79                    }
80                  }
81                }
82              }
83            }
84          }
85        }
86      }
87
88      return result.ToArray();
89    }
90  }
91}
Note: See TracBrowser for help on using the repository browser.