Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Problems.VehicleRouting/3.4/Encodings/Potvin/Crossovers/PotvinRouteBasedCrossover.cs @ 8053

Last change on this file since 8053 was 8053, checked in by ascheibe, 12 years ago

#1722 fixed more licensing information and source formatting

File size: 3.5 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2012 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.Encodings.PermutationEncoding;
25using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
26
27namespace HeuristicLab.Problems.VehicleRouting.Encodings.Potvin {
28  [Item("PotvinRouteBasedCrossover", "The RBX crossover for a VRP representations.  It is implemented as described in Potvin, J.-Y. and Bengio, S. (1996). The Vehicle Routing Problem with Time Windows - Part II: Genetic Search. INFORMS Journal of Computing, 8:165–172.")]
29  [StorableClass]
30  public sealed class PotvinRouteBasedCrossover : PotvinCrossover {
31    [StorableConstructor]
32    private PotvinRouteBasedCrossover(bool deserializing) : base(deserializing) { }
33
34    public PotvinRouteBasedCrossover()
35      : base() { }
36
37    public override IDeepCloneable Clone(Cloner cloner) {
38      return new PotvinRouteBasedCrossover(this, cloner);
39    }
40
41    private PotvinRouteBasedCrossover(PotvinRouteBasedCrossover original, Cloner cloner)
42      : base(original, cloner) {
43    }
44
45    protected override PotvinEncoding Crossover(IRandom random, PotvinEncoding parent1, PotvinEncoding parent2) {
46      bool allowInfeasible = AllowInfeasibleSolutions.Value.Value;
47
48      PotvinEncoding child = parent2.Clone() as PotvinEncoding;
49
50      if (parent1.Tours.Count > 0 && child.Tours.Count > 0) {
51        int tourParent1 = random.Next(parent1.Tours.Count);
52        Tour replacing = parent1.Tours[tourParent1].Clone() as Tour;
53
54        int tourParent2 = random.Next(child.Tours.Count);
55        Tour replaced = child.Tours[tourParent2];
56
57        child.Tours.Remove(replaced);
58        child.Tours.Insert(tourParent2, replacing);
59
60        Permutation vehicleAssignment = child.VehicleAssignment;
61
62        int vehicle = vehicleAssignment[tourParent2];
63        int vehicle2 = parent1.VehicleAssignment[tourParent1];
64        vehicleAssignment[tourParent2] = vehicle2;
65
66        for (int i = 0; i < vehicleAssignment.Length; i++) {
67          if (vehicleAssignment[i] == vehicle2 && i != tourParent2) {
68            vehicleAssignment[i] = vehicle;
69            break;
70          }
71        }
72
73        foreach (int city in replaced.Stops)
74          if (FindRoute(child, city) == null && !child.Unrouted.Contains(city))
75            child.Unrouted.Add(city);
76
77        if (Repair(random, child, replacing, ProblemInstance, allowInfeasible) || allowInfeasible)
78          return child;
79        else {
80          if (random.NextDouble() < 0.5)
81            return parent1.Clone() as PotvinEncoding;
82          else
83            return parent2.Clone() as PotvinEncoding;
84        }
85      } else {
86        return child;
87      }
88    }
89  }
90}
Note: See TracBrowser for help on using the repository browser.