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
Location:
branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Evaluation
Files:
1 edited
1 moved

Legend:

Unmodified
Added
Removed
  • branches/GeneralizedQAP/HeuristicLab.Problems.GeneralizedQuadraticAssignment/3.3/Evaluation/GQAPNMoveEvaluator.cs

    r7970 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.
     
    2020#endregion
    2121
     22using System;
     23using System.Linq;
    2224using HeuristicLab.Common;
    2325using HeuristicLab.Core;
     
    2527using HeuristicLab.Encodings.IntegerVectorEncoding;
    2628using HeuristicLab.Operators;
    27 using HeuristicLab.Optimization;
    2829using HeuristicLab.Parameters;
    2930using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
     
    3233  [Item("N-Move Evaluator", "Evaluates an N-Move.")]
    3334  [StorableClass]
    34   public class GQAPNMoveEvaluator : SingleSuccessorOperator, IGQAPNMoveEvaluator, IAssignmentAwareGQAPOperator,
    35   IQualityAwareGQAPOperator, ITransportationCostsAwareGQAPOperator,
    36   IExpectedRandomQualityAwareGQAPOperator, IWeightsAwareGQAPOperator, IDistancesAwareGQAPOperator,
    37   IInstallationCostsAwareGQAPOperator, IDemandsAwareGQAPOperator, ICapacitiesAwareGQAPOperator,
    38   IEvaluatorAwareGQAPOperator {
     35  public class GQAPNMoveEvaluator : SingleSuccessorOperator, IGQAPNMoveEvaluator,
     36    IQualityAwareGQAPOperator, IProblemInstanceAwareGQAPOperator {
    3937
    4038    #region Parameter Descriptions
    4139    public static readonly string MoveQualityDescription = "The quality of the move if it would be applied.";
    42     public static readonly string MoveFlowDistanceQualityDescription = "The quality of the move regarding the flow-distance criteria.";
    43     public static readonly string MoveInstallationQualityDescription = "The quality of the move regarding the installation costs.";
    44     public static readonly string MoveOverbookedCapacityDescription = "The sum of the overbooked capacities of the move relative to the capacity of each location.";
     40    public static readonly string MoveEvaluationDescription = "The results of evaluating the move.";
    4541    #endregion
    4642
    4743    #region Parameter Properties
    48     ILookupParameter<BoolValue> IQualityAwareGQAPOperator.MaximizationParameter {
    49       get { return MaximizationParameter; }
    50     }
    51     ILookupParameter<BoolValue> IGQAPMoveEvaluator.MaximizationParameter {
    52       get { return MaximizationParameter; }
    53     }
    54     public ILookupParameter<BoolValue> MaximizationParameter {
    55       get { return (ILookupParameter<BoolValue>)Parameters["Maximization"]; }
    56     }
    5744    public ILookupParameter<DoubleValue> MoveQualityParameter {
    5845      get { return (ILookupParameter<DoubleValue>)Parameters["MoveQuality"]; }
    5946    }
    60     public ILookupParameter<DoubleValue> MoveFlowDistanceQualityParameter {
    61       get { return (ILookupParameter<DoubleValue>)Parameters["MoveFlowDistanceQuality"]; }
    62     }
    63     public ILookupParameter<DoubleValue> MoveInstallationQualityParameter {
    64       get { return (ILookupParameter<DoubleValue>)Parameters["MoveInstallationQuality"]; }
    65     }
    66     public ILookupParameter<DoubleValue> MoveOverbookedCapacityParameter {
    67       get { return (ILookupParameter<DoubleValue>)Parameters["MoveOverbookedCapacity"]; }
     47    public ILookupParameter<Evaluation> MoveEvaluationParameter {
     48      get { return (ILookupParameter<Evaluation>)Parameters["MoveEvaluation"]; }
    6849    }
    6950    public ILookupParameter<NMove> MoveParameter {
     
    7354      get { return (ILookupParameter<IntegerVector>)Parameters["Assignment"]; }
    7455    }
    75     ILookupParameter<DoubleValue> ISingleObjectiveMoveEvaluator.QualityParameter {
    76       get { return QualityParameter; }
    77     }
    78     ILookupParameter<DoubleValue> IQualityAwareGQAPOperator.QualityParameter {
    79       get { return QualityParameter; }
    80     }
    8156    public ILookupParameter<DoubleValue> QualityParameter {
    8257      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
    8358    }
    84     public ILookupParameter<DoubleValue> FlowDistanceQualityParameter {
    85       get { return (ILookupParameter<DoubleValue>)Parameters["FlowDistanceQuality"]; }
     59    public ILookupParameter<Evaluation> EvaluationParameter {
     60      get { return (ILookupParameter<Evaluation>)Parameters["Evaluation"]; }
    8661    }
    87     public ILookupParameter<DoubleValue> InstallationQualityParameter {
    88       get { return (ILookupParameter<DoubleValue>)Parameters["InstallationQuality"]; }
    89     }
    90     public ILookupParameter<DoubleValue> OverbookedCapacityParameter {
    91       get { return (ILookupParameter<DoubleValue>)Parameters["OverbookedCapacity"]; }
    92     }
    93     public IValueLookupParameter<DoubleValue> TransportationCostsParameter {
    94       get { return (IValueLookupParameter<DoubleValue>)Parameters["TransportationCosts"]; }
    95     }
    96     public IValueLookupParameter<DoubleValue> ExpectedRandomQualityParameter {
    97       get { return (IValueLookupParameter<DoubleValue>)Parameters["ExpectedRandomQuality"]; }
    98     }
    99     public ILookupParameter<DoubleMatrix> WeightsParameter {
    100       get { return (ILookupParameter<DoubleMatrix>)Parameters["Weights"]; }
    101     }
    102     public ILookupParameter<DoubleMatrix> DistancesParameter {
    103       get { return (ILookupParameter<DoubleMatrix>)Parameters["Distances"]; }
    104     }
    105     public ILookupParameter<DoubleMatrix> InstallationCostsParameter {
    106       get { return (ILookupParameter<DoubleMatrix>)Parameters["InstallationCosts"]; }
    107     }
    108     public ILookupParameter<DoubleArray> DemandsParameter {
    109       get { return (ILookupParameter<DoubleArray>)Parameters["Demands"]; }
    110     }
    111     public ILookupParameter<DoubleArray> CapacitiesParameter {
    112       get { return (ILookupParameter<DoubleArray>)Parameters["Capacities"]; }
    113     }
    114     public IValueLookupParameter<IGQAPEvaluator> EvaluatorParameter {
    115       get { return (IValueLookupParameter<IGQAPEvaluator>)Parameters["Evaluator"]; }
     62    public ILookupParameter<GQAPInstance> ProblemInstanceParameter {
     63      get { return (ILookupParameter<GQAPInstance>)Parameters["ProblemInstance"]; }
    11664    }
    11765    #endregion
     
    12472      Parameters.Add(new LookupParameter<IntegerVector>("Assignment", GQAPSolutionCreator.AssignmentDescription));
    12573      Parameters.Add(new LookupParameter<NMove>("Move", GQAPNMoveGenerator.MoveDescription));
    126       Parameters.Add(new LookupParameter<BoolValue>("Maximization", GeneralizedQuadraticAssignmentProblem.MaximizationDescription));
    127       Parameters.Add(new LookupParameter<DoubleValue>("Quality", GQAPEvaluator.QualityDescription));
    128       Parameters.Add(new LookupParameter<DoubleValue>("FlowDistanceQuality", GQAPEvaluator.FlowDistanceQualityDescription));
    129       Parameters.Add(new LookupParameter<DoubleValue>("InstallationQuality", GQAPEvaluator.InstallationQualityDescription));
    130       Parameters.Add(new LookupParameter<DoubleValue>("OverbookedCapacity", GQAPEvaluator.OverbookedCapacityDescription));
     74      Parameters.Add(new LookupParameter<DoubleValue>("Quality", ""));
     75      Parameters.Add(new LookupParameter<Evaluation>("Evaluation", GQAP.EvaluationDescription));
    13176      Parameters.Add(new LookupParameter<DoubleValue>("MoveQuality", MoveQualityDescription));
    132       Parameters.Add(new LookupParameter<DoubleValue>("MoveFlowDistanceQuality", MoveFlowDistanceQualityDescription));
    133       Parameters.Add(new LookupParameter<DoubleValue>("MoveInstallationQuality", MoveInstallationQualityDescription));
    134       Parameters.Add(new LookupParameter<DoubleValue>("MoveOverbookedCapacity", MoveOverbookedCapacityDescription));
    135       Parameters.Add(new ValueLookupParameter<DoubleValue>("ExpectedRandomQuality", GeneralizedQuadraticAssignmentProblem.ExpectedRandomQualityDescription));
    136       Parameters.Add(new ValueLookupParameter<DoubleValue>("TransportationCosts", GeneralizedQuadraticAssignmentProblem.TransportationCostsDescription));
    137       Parameters.Add(new LookupParameter<DoubleMatrix>("Weights", GeneralizedQuadraticAssignmentProblem.WeightsDescription));
    138       Parameters.Add(new LookupParameter<DoubleMatrix>("Distances", GeneralizedQuadraticAssignmentProblem.DistancesDescription));
    139       Parameters.Add(new LookupParameter<DoubleMatrix>("InstallationCosts", GeneralizedQuadraticAssignmentProblem.InstallationCostsDescription));
    140       Parameters.Add(new LookupParameter<DoubleArray>("Demands", GeneralizedQuadraticAssignmentProblem.DemandsDescription));
    141       Parameters.Add(new LookupParameter<DoubleArray>("Capacities", GeneralizedQuadraticAssignmentProblem.CapacitiesDescription));
    142       Parameters.Add(new ValueLookupParameter<IGQAPEvaluator>("Evaluator", "The evaluator that is used to evaluate GQAP solutions."));
     77      Parameters.Add(new LookupParameter<Evaluation>("MoveEvaluation", MoveEvaluationDescription));
     78      Parameters.Add(new LookupParameter<GQAPInstance>("ProblemInstance", GQAP.ProblemInstanceDescription));
    14379    }
    14480
     
    14783    }
    14884
    149     public static double Evaluate(NMove move, IntegerVector assignment, DoubleMatrix weights, DoubleMatrix distances, DoubleMatrix installationCosts,
    150       DoubleArray demands, DoubleArray capacities, double transportationCosts, double expectedRandomQuality, IGQAPEvaluator evaluator) {
    151       double moveFlowDistanceQuality, moveInstallationQuality, moveOverbookedCapacity;
    152       Evaluate(move, assignment, weights, distances, installationCosts, demands, capacities, evaluator,
    153         out moveFlowDistanceQuality, out moveInstallationQuality, out moveOverbookedCapacity);
    154       return evaluator.GetFitness(moveFlowDistanceQuality, moveInstallationQuality, moveOverbookedCapacity,
    155         transportationCosts, expectedRandomQuality);
    156     }
    157 
    158     public static void Evaluate(NMove move, IntegerVector assignment, DoubleMatrix weights, DoubleMatrix distances, DoubleMatrix installationCosts,
    159       DoubleArray demands, DoubleArray capacities, IGQAPEvaluator evaluator, out double moveFlowDistanceQuality, out double moveInstallationQuality, out double moveOverbookedCapacity) {
    160       moveFlowDistanceQuality = moveInstallationQuality = moveOverbookedCapacity = 0.0;
     85    public static Evaluation Evaluate(NMove move, IntegerVector assignment, Evaluation evaluation, GQAPInstance problemInstance) {
    16186      int moves = move.N;
    162       var slack = (DoubleArray)capacities.Clone();
    163       var oldSlack = (DoubleArray)slack.Clone();
    164       bool first = true;
     87      var newEvaluation = new Evaluation() {
     88        ExcessDemand = evaluation.ExcessDemand,
     89        FlowCosts = evaluation.FlowCosts,
     90        InstallationCosts = evaluation.InstallationCosts,
     91        Slack = evaluation.Slack.ToArray()
     92      };
    16593      foreach (var kvp in move.NewAssignments) {
    16694        int equip = kvp.Key;
    16795        int newLoc = kvp.Value;
    168         moveInstallationQuality -= installationCosts[equip, assignment[equip]];
    169         moveInstallationQuality += installationCosts[equip, newLoc];
     96        int oldLoc = assignment[equip];
     97        var equipDemand = problemInstance.Demands[equip];
     98        newEvaluation.InstallationCosts -= problemInstance.InstallationCosts[equip, oldLoc];
     99        newEvaluation.InstallationCosts += problemInstance.InstallationCosts[equip, newLoc];
    170100        for (int j = 0; j < assignment.Length; j++) {
    171101          if (!move.NewAssignments.ContainsKey(j)) {
    172             moveFlowDistanceQuality += weights[equip, j] * distances[newLoc, assignment[j]];
    173             moveFlowDistanceQuality -= weights[equip, j] * distances[assignment[equip], assignment[j]];
    174             moveFlowDistanceQuality += weights[j, equip] * distances[assignment[j], newLoc];
    175             moveFlowDistanceQuality -= weights[j, equip] * distances[assignment[j], assignment[equip]];
    176             if (first) { // only once for each untouched equipment deduct the demand from the capacity
    177               slack[assignment[j]] -= demands[j];
    178               oldSlack[assignment[j]] -= demands[j];
    179             }
     102            newEvaluation.FlowCosts += problemInstance.Weights[equip, j] * problemInstance.Distances[newLoc, assignment[j]];
     103            newEvaluation.FlowCosts -= problemInstance.Weights[equip, j] * problemInstance.Distances[oldLoc, assignment[j]];
     104            newEvaluation.FlowCosts += problemInstance.Weights[j, equip] * problemInstance.Distances[assignment[j], newLoc];
     105            newEvaluation.FlowCosts -= problemInstance.Weights[j, equip] * problemInstance.Distances[assignment[j], oldLoc];
    180106          } else {
    181             moveFlowDistanceQuality += weights[equip, j] * distances[newLoc, move.NewAssignments[j]];
    182             moveFlowDistanceQuality -= weights[equip, j] * distances[assignment[equip], assignment[j]];
     107            newEvaluation.FlowCosts += problemInstance.Weights[equip, j] * problemInstance.Distances[newLoc, move.NewAssignments[j]];
     108            newEvaluation.FlowCosts -= problemInstance.Weights[equip, j] * problemInstance.Distances[oldLoc, assignment[j]];
    183109          }
    184110        }
    185         first = false;
    186         slack[newLoc] -= demands[equip];
    187         oldSlack[assignment[equip]] -= demands[equip];
     111        newEvaluation.Slack[oldLoc] += equipDemand;
     112        if (newEvaluation.Slack[oldLoc] < equipDemand)
     113          newEvaluation.ExcessDemand -= Math.Min(equipDemand, equipDemand - newEvaluation.Slack[oldLoc]);
     114        newEvaluation.Slack[newLoc] -= equipDemand;
     115        if (newEvaluation.Slack[newLoc] < 0)
     116          newEvaluation.ExcessDemand += Math.Min(equipDemand, -newEvaluation.Slack[newLoc]);
    188117      }
    189118
    190       moveOverbookedCapacity = evaluator.EvaluateOverbooking(slack, capacities) - evaluator.EvaluateOverbooking(oldSlack, capacities);
     119      return newEvaluation;
    191120    }
    192121
    193122    public override IOperation Apply() {
    194       var evaluator = EvaluatorParameter.ActualValue;
    195       double moveFlowDistanceQuality, moveInstallationQuality, moveOverbookedCapacity;
    196       double quality = QualityParameter.ActualValue.Value;
    197       double transportationCosts = TransportationCostsParameter.ActualValue.Value;
    198       double expectedRandomQuality = ExpectedRandomQualityParameter.ActualValue.Value;
     123      var problemInstance = ProblemInstanceParameter.ActualValue;
     124      var evaluation = EvaluationParameter.ActualValue;
    199125
    200       double flowDistanceQuality = FlowDistanceQualityParameter.ActualValue.Value;
    201       double installationQuality = InstallationQualityParameter.ActualValue.Value;
    202       double overbookedCapacity = OverbookedCapacityParameter.ActualValue.Value;
     126      var moveEvaluation = Evaluate(MoveParameter.ActualValue,
     127               AssignmentParameter.ActualValue,
     128               evaluation,
     129               problemInstance);
    203130
    204       Evaluate(MoveParameter.ActualValue,
    205                AssignmentParameter.ActualValue,
    206                WeightsParameter.ActualValue, DistancesParameter.ActualValue,
    207                InstallationCostsParameter.ActualValue,
    208                DemandsParameter.ActualValue, CapacitiesParameter.ActualValue,
    209                evaluator,
    210                out moveFlowDistanceQuality, out moveInstallationQuality, out moveOverbookedCapacity);
    211 
    212       MoveFlowDistanceQualityParameter.ActualValue = new DoubleValue(flowDistanceQuality + moveFlowDistanceQuality);
    213       MoveInstallationQualityParameter.ActualValue = new DoubleValue(installationQuality + moveInstallationQuality);
    214       MoveOverbookedCapacityParameter.ActualValue = new DoubleValue(overbookedCapacity + moveOverbookedCapacity);
    215 
    216       MoveQualityParameter.ActualValue = new DoubleValue(evaluator.GetFitness(
    217         flowDistanceQuality + moveFlowDistanceQuality,
    218         installationQuality + moveInstallationQuality,
    219         overbookedCapacity + moveOverbookedCapacity,
    220         transportationCosts, expectedRandomQuality));
     131      MoveEvaluationParameter.ActualValue = moveEvaluation;
    221132      return base.Apply();
    222133    }
Note: See TracChangeset for help on using the changeset viewer.