Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
12/10/17 22:11:10 (6 years ago)
Author:
abeham
Message:

#1614: refactored code

  • change problem to derive from basic problem
  • using a combined instance class instead of individual parameters
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Operators/Crossovers/CordeauCrossover.cs

    r15490 r15504  
    11#region License Information
    22/* HeuristicLab
    3  * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
     3 * Copyright (C) 2002-2017 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
    44 *
    55 * This file is part of HeuristicLab.
     
    3434  [StorableClass]
    3535  public class CordeauCrossover : GQAPCrossover,
    36     IQualitiesAwareGQAPOperator, IWeightsAwareGQAPOperator, IDistancesAwareGQAPOperator, IInstallationCostsAwareGQAPOperator,
    37     IDemandsAwareGQAPOperator, ICapacitiesAwareGQAPOperator, ITransportationCostsAwareGQAPOperator,
    38     IExpectedRandomQualityAwareGQAPOperator {
     36    IQualitiesAwareGQAPOperator, IProblemInstanceAwareGQAPOperator {
    3937
    4038    public ILookupParameter<BoolValue> MaximizationParameter {
     
    4442      get { return (IScopeTreeLookupParameter<DoubleValue>)Parameters["Quality"]; }
    4543    }
    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"]; }
    7846    }
    7947    public ILookupParameter<IntValue> EvaluatedSolutionsParameter {
     
    8856    public CordeauCrossover()
    8957      : 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));
    10361      Parameters.Add(new LookupParameter<IntValue>("EvaluatedSolutions", "The number of evaluated solutions."));
    10462    }
     
    10866    }
    10967
    110     public static IntegerVector Apply(IRandom random, BoolValue maximization,
     68    public static IntegerVector Apply(IRandom random, bool maximization,
    11169      IntegerVector parent1, DoubleValue quality1,
    11270      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
    11676      var medianDistances = Enumerable.Range(0, distances.Rows).Select(x => distances.GetRow(x).Median()).ToArray();
    11777
     
    12080     
    12181      bool onefound = false;
    122       double fbest, fbestAttempt = maximization.Value ? double.MinValue : double.MaxValue;
     82      double fbest, fbestAttempt = maximization ? double.MinValue : double.MaxValue;
    12383      IntegerVector bestAttempt = null;
    12484      IntegerVector result = null;
    12585
    12686      fbest = quality1.Value;
    127       if (maximization.Value && quality1.Value < quality2.Value
    128         || !maximization.Value && quality1.Value > quality2.Value) {
     87      if (maximization && quality1.Value < quality2.Value
     88        || !maximization && quality1.Value > quality2.Value) {
    12989        var temp = parent1;
    13090        parent1 = parent2;
     
    140100          TryRandomAssignment(random, demands, capacities, m, n, cap, child, ref unassigned);
    141101        if (unassigned == 0) {
    142           var childFit = evaluator.Evaluate(child, weights, distances, installationCosts, demands, capacities, transportationCosts, expectedRandomQuality);
     102          var childFit = problemInstance.ToSingleObjective(problemInstance.Evaluate(child));
    143103          evaluatedSolutions.Value++;
    144           if (maximization.Value && childFit >= fbest
    145             || !maximization.Value && childFit <= fbest) {
     104          if (maximization && childFit >= fbest
     105            || !maximization && childFit <= fbest) {
    146106            fbest = childFit;
    147107            result = child;
    148108            onefound = true;
    149109          }
    150           if (!onefound && (maximization.Value && fbestAttempt < childFit || !maximization.Value && fbestAttempt > childFit)) {
     110          if (!onefound && (maximization && fbestAttempt < childFit || !maximization && fbestAttempt > childFit)) {
    151111            bestAttempt = child;
    152112            fbestAttempt = childFit;
     
    162122        RandomAssignment(random, demands, capacities, m, n, cap, child, ref unassigned);
    163123
    164         var childFit = evaluator.Evaluate(child, weights, distances, installationCosts, demands, capacities, transportationCosts, expectedRandomQuality);
     124        var childFit = problemInstance.ToSingleObjective(problemInstance.Evaluate(child));
    165125        evaluatedSolutions.Value++;
    166126        if (childFit < fbest) {
     
    170130        }
    171131
    172         if (!onefound && (maximization.Value && fbestAttempt < childFit || !maximization.Value && fbestAttempt > childFit)) {
     132        if (!onefound && (maximization && fbestAttempt < childFit || !maximization && fbestAttempt > childFit)) {
    173133          bestAttempt = child;
    174134          fbestAttempt = childFit;
     
    237197    }
    238198
    239     protected override IntegerVector Cross(IRandom random, ItemArray<IntegerVector> parents) {
     199    protected override IntegerVector Cross(IRandom random, ItemArray<IntegerVector> parents,
     200      GQAPInstance problemInstance) {
    240201      if (parents == null) throw new ArgumentNullException("parents");
    241202      if (parents.Length != 2) throw new ArgumentException(Name + " works only with exactly two parents.");
    242203
    243204      var qualities = QualityParameter.ActualValue;
    244       return Apply(random, MaximizationParameter.ActualValue,
     205      return Apply(random, MaximizationParameter.ActualValue.Value,
    245206        parents[0], qualities[0],
    246207        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);
    251210    }
    252211  }
Note: See TracChangeset for help on using the changeset viewer.