Changeset 15504 for branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Crossovers/CordeauCrossover.cs
- Timestamp:
- 12/10/17 22:11:10 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Crossovers/CordeauCrossover.cs
r15490 r15504 1 1 #region License Information 2 2 /* HeuristicLab 3 * Copyright (C) 2002-201 2Heuristic and Evolutionary Algorithms Laboratory (HEAL)3 * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL) 4 4 * 5 5 * This file is part of HeuristicLab. … … 34 34 [StorableClass] 35 35 public class CordeauCrossover : GQAPCrossover, 36 IQualitiesAwareGQAPOperator, IWeightsAwareGQAPOperator, IDistancesAwareGQAPOperator, IInstallationCostsAwareGQAPOperator, 37 IDemandsAwareGQAPOperator, ICapacitiesAwareGQAPOperator, ITransportationCostsAwareGQAPOperator, 38 IExpectedRandomQualityAwareGQAPOperator { 36 IQualitiesAwareGQAPOperator, IProblemInstanceAwareGQAPOperator { 39 37 40 38 public ILookupParameter<BoolValue> MaximizationParameter { … … 44 42 get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; } 45 43 } 46 public IScopeTreeLookupParameter<DoubleValue> FlowDistanceQualityParameter { 47 get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["FlowDistanceQuality"]; } 48 } 49 public IScopeTreeLookupParameter<DoubleValue> InstallationQualityParameter { 50 get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["InstallationQuality"]; } 51 } 52 public IScopeTreeLookupParameter<DoubleValue> OverbookedCapacityParameter { 53 get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["OverbookedCapacity"]; } 54 } 55 public ILookupParameter<DoubleMatrix> WeightsParameter { 56 get { return (ILookupParameter<DoubleMatrix>)Parameters["Weights"]; } 57 } 58 public ILookupParameter<DoubleMatrix> DistancesParameter { 59 get { return (ILookupParameter<DoubleMatrix>)Parameters["Distances"]; } 60 } 61 public ILookupParameter<DoubleMatrix> InstallationCostsParameter { 62 get { return (ILookupParameter<DoubleMatrix>)Parameters["InstallationCosts"]; } 63 } 64 public ILookupParameter<DoubleArray> DemandsParameter { 65 get { return (ILookupParameter<DoubleArray>)Parameters["Demands"]; } 66 } 67 public ILookupParameter<DoubleArray> CapacitiesParameter { 68 get { return (ILookupParameter<DoubleArray>)Parameters["Capacities"]; } 69 } 70 public IValueLookupParameter<DoubleValue> TransportationCostsParameter { 71 get { return (IValueLookupParameter<DoubleValue>)Parameters["TransportationCosts"]; } 72 } 73 public IValueLookupParameter<DoubleValue> ExpectedRandomQualityParameter { 74 get { return (IValueLookupParameter<DoubleValue>)Parameters["ExpectedRandomQuality"]; } 75 } 76 public IValueLookupParameter<IGQAPEvaluator> EvaluatorParameter { 77 get { return (IValueLookupParameter<IGQAPEvaluator>)Parameters["Evaluator"]; } 44 public IScopeTreeLookupParameter<Evaluation> EvaluationParameter { 45 get { return (IScopeTreeLookupParameter<Evaluation>)Parameters["Evaluation"]; } 78 46 } 79 47 public ILookupParameter<IntValue> EvaluatedSolutionsParameter { … … 88 56 public CordeauCrossover() 89 57 : base() { 90 Parameters.Add(new LookupParameter<BoolValue>("Maximization", GeneralizedQuadraticAssignmentProblem.MaximizationDescription)); 91 Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", GQAPEvaluator.QualityDescription, 1)); 92 Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("FlowDistanceQuality", GQAPEvaluator.FlowDistanceQualityDescription, 1)); 93 Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("InstallationQuality", GQAPEvaluator.InstallationQualityDescription, 1)); 94 Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("OverbookedCapacity", GQAPEvaluator.OverbookedCapacityDescription, 1)); 95 Parameters.Add(new LookupParameter<DoubleMatrix>("Weights", GeneralizedQuadraticAssignmentProblem.WeightsDescription)); 96 Parameters.Add(new LookupParameter<DoubleMatrix>("Distances", GeneralizedQuadraticAssignmentProblem.DistancesDescription)); 97 Parameters.Add(new LookupParameter<DoubleMatrix>("InstallationCosts", GeneralizedQuadraticAssignmentProblem.InstallationCostsDescription)); 98 Parameters.Add(new LookupParameter<DoubleArray>("Demands", GeneralizedQuadraticAssignmentProblem.DemandsDescription)); 99 Parameters.Add(new LookupParameter<DoubleArray>("Capacities", GeneralizedQuadraticAssignmentProblem.CapacitiesDescription)); 100 Parameters.Add(new ValueLookupParameter<DoubleValue>("TransportationCosts", GeneralizedQuadraticAssignmentProblem.TransportationCostsDescription)); 101 Parameters.Add(new ValueLookupParameter<DoubleValue>("ExpectedRandomQuality", GeneralizedQuadraticAssignmentProblem.ExpectedRandomQualityDescription)); 102 Parameters.Add(new ValueLookupParameter<IGQAPEvaluator>("Evaluator", "The evaluator used to evaluate solutions.")); 58 Parameters.Add(new LookupParameter<BoolValue>("Maximization", "")); 59 Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("Quality", "The quality of the parents", 1)); 60 Parameters.Add(new ScopeTreeLookupParameter<Evaluation>("Evaluation", GQAP.EvaluationDescription, 1)); 103 61 Parameters.Add(new LookupParameter<IntValue>("EvaluatedSolutions", "The number of evaluated solutions.")); 104 62 } … … 108 66 } 109 67 110 public static IntegerVector Apply(IRandom random, BoolValuemaximization,68 public static IntegerVector Apply(IRandom random, bool maximization, 111 69 IntegerVector parent1, DoubleValue quality1, 112 70 IntegerVector parent2, DoubleValue quality2, 113 DoubleMatrix weights, DoubleMatrix distances, DoubleMatrix installationCosts, 114 DoubleArray demands, DoubleArray capacities, 115 double transportationCosts, double expectedRandomQuality, IGQAPEvaluator evaluator, IntValue evaluatedSolutions) { 71 GQAPInstance problemInstance, IntValue evaluatedSolutions) { 72 var distances = problemInstance.Distances; 73 var capacities = problemInstance.Capacities; 74 var demands = problemInstance.Demands; 75 116 76 var medianDistances = Enumerable.Range(0, distances.Rows).Select(x => distances.GetRow(x).Median()).ToArray(); 117 77 … … 120 80 121 81 bool onefound = false; 122 double fbest, fbestAttempt = maximization .Value? double.MinValue : double.MaxValue;82 double fbest, fbestAttempt = maximization ? double.MinValue : double.MaxValue; 123 83 IntegerVector bestAttempt = null; 124 84 IntegerVector result = null; 125 85 126 86 fbest = quality1.Value; 127 if (maximization .Value&& quality1.Value < quality2.Value128 || !maximization .Value&& quality1.Value > quality2.Value) {87 if (maximization && quality1.Value < quality2.Value 88 || !maximization && quality1.Value > quality2.Value) { 129 89 var temp = parent1; 130 90 parent1 = parent2; … … 140 100 TryRandomAssignment(random, demands, capacities, m, n, cap, child, ref unassigned); 141 101 if (unassigned == 0) { 142 var childFit = evaluator.Evaluate(child, weights, distances, installationCosts, demands, capacities, transportationCosts, expectedRandomQuality);102 var childFit = problemInstance.ToSingleObjective(problemInstance.Evaluate(child)); 143 103 evaluatedSolutions.Value++; 144 if (maximization .Value&& childFit >= fbest145 || !maximization .Value&& childFit <= fbest) {104 if (maximization && childFit >= fbest 105 || !maximization && childFit <= fbest) { 146 106 fbest = childFit; 147 107 result = child; 148 108 onefound = true; 149 109 } 150 if (!onefound && (maximization .Value && fbestAttempt < childFit || !maximization.Value&& fbestAttempt > childFit)) {110 if (!onefound && (maximization && fbestAttempt < childFit || !maximization && fbestAttempt > childFit)) { 151 111 bestAttempt = child; 152 112 fbestAttempt = childFit; … … 162 122 RandomAssignment(random, demands, capacities, m, n, cap, child, ref unassigned); 163 123 164 var childFit = evaluator.Evaluate(child, weights, distances, installationCosts, demands, capacities, transportationCosts, expectedRandomQuality);124 var childFit = problemInstance.ToSingleObjective(problemInstance.Evaluate(child)); 165 125 evaluatedSolutions.Value++; 166 126 if (childFit < fbest) { … … 170 130 } 171 131 172 if (!onefound && (maximization .Value && fbestAttempt < childFit || !maximization.Value&& fbestAttempt > childFit)) {132 if (!onefound && (maximization && fbestAttempt < childFit || !maximization && fbestAttempt > childFit)) { 173 133 bestAttempt = child; 174 134 fbestAttempt = childFit; … … 237 197 } 238 198 239 protected override IntegerVector Cross(IRandom random, ItemArray<IntegerVector> parents) { 199 protected override IntegerVector Cross(IRandom random, ItemArray<IntegerVector> parents, 200 GQAPInstance problemInstance) { 240 201 if (parents == null) throw new ArgumentNullException("parents"); 241 202 if (parents.Length != 2) throw new ArgumentException(Name + " works only with exactly two parents."); 242 203 243 204 var qualities = QualityParameter.ActualValue; 244 return Apply(random, MaximizationParameter.ActualValue ,205 return Apply(random, MaximizationParameter.ActualValue.Value, 245 206 parents[0], qualities[0], 246 207 parents[1], qualities[1], 247 WeightsParameter.ActualValue, DistancesParameter.ActualValue, InstallationCostsParameter.ActualValue, 248 DemandsParameter.ActualValue, CapacitiesParameter.ActualValue, 249 TransportationCostsParameter.ActualValue.Value, ExpectedRandomQualityParameter.ActualValue.Value, 250 EvaluatorParameter.ActualValue, EvaluatedSolutionsParameter.ActualValue); 208 problemInstance, 209 EvaluatedSolutionsParameter.ActualValue); 251 210 } 252 211 }
Note: See TracChangeset
for help on using the changeset viewer.