#region License Information
/* HeuristicLab
* Copyright (C) 2002-2018 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
*
* This file is part of HeuristicLab.
*
* HeuristicLab is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* HeuristicLab is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with HeuristicLab. If not, see .
*/
#endregion
using System;
using HeuristicLab.Analysis;
using HeuristicLab.Common;
using HeuristicLab.Core;
using HeuristicLab.Data;
using HeuristicLab.Operators;
using HeuristicLab.Optimization;
using HeuristicLab.Optimization.Operators;
using HeuristicLab.Parameters;
using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
using HeuristicLab.Problems.VehicleRouting.Interfaces;
using HeuristicLab.Problems.VehicleRouting.Variants;
namespace HeuristicLab.Problems.VehicleRouting {
///
/// An operator which analyzes the best, average and worst quality of solutions in the scope tree.
///
[Item("BestAverageWorstVRPToursAnalyzer", "An operator which analyzes the best, average and worst properties of the VRP tours in the scope tree.")]
[StorableClass]
public sealed class BestAverageWorstVRPToursAnalyzer : AlgorithmOperator, IAnalyzer, IGeneralVRPOperator {
#region Parameter properties
public ILookupParameter ProblemInstanceParameter {
get { return (ILookupParameter)Parameters["ProblemInstance"]; }
}
public ScopeTreeLookupParameter DistanceParameter {
get { return (ScopeTreeLookupParameter)Parameters["Distance"]; }
}
public ValueLookupParameter BestDistanceParameter {
get { return (ValueLookupParameter)Parameters["BestDistance"]; }
}
public ValueLookupParameter CurrentBestDistanceParameter {
get { return (ValueLookupParameter)Parameters["CurrentBestDistance"]; }
}
public ValueLookupParameter CurrentAverageDistanceParameter {
get { return (ValueLookupParameter)Parameters["CurrentAverageDistance"]; }
}
public ValueLookupParameter CurrentWorstDistanceParameter {
get { return (ValueLookupParameter)Parameters["CurrentWorstDistance"]; }
}
public ValueLookupParameter DistancesParameter {
get { return (ValueLookupParameter)Parameters["Distances"]; }
}
public ScopeTreeLookupParameter VehiclesUtilizedParameter {
get { return (ScopeTreeLookupParameter)Parameters["VehiclesUtilized"]; }
}
public ValueLookupParameter BestVehiclesUtilizedParameter {
get { return (ValueLookupParameter)Parameters["BestVehiclesUtilized"]; }
}
public ValueLookupParameter CurrentBestVehiclesUtilizedParameter {
get { return (ValueLookupParameter)Parameters["CurrentBestVehiclesUtilized"]; }
}
public ValueLookupParameter CurrentAverageVehiclesUtilizedParameter {
get { return (ValueLookupParameter)Parameters["CurrentAverageVehiclesUtilized"]; }
}
public ValueLookupParameter CurrentWorstVehiclesUtilizedParameter {
get { return (ValueLookupParameter)Parameters["CurrentWorstVehiclesUtilized"]; }
}
public ValueLookupParameter VehiclesUtilizedValuesParameter {
get { return (ValueLookupParameter)Parameters["VehiclesUtilizedValues"]; }
}
public ValueLookupParameter ResultsParameter {
get { return (ValueLookupParameter)Parameters["Results"]; }
}
#endregion
#region Properties
public bool EnabledByDefault {
get { return true; }
}
private BestVRPToursMemorizer BestMemorizer {
get { return (BestVRPToursMemorizer)OperatorGraph.InitialOperator; }
}
private BestAverageWorstVRPToursCalculator BestAverageWorstCalculator {
get { return (BestAverageWorstVRPToursCalculator)BestMemorizer.Successor; }
}
#endregion
public BestAverageWorstVRPToursAnalyzer()
: base() {
#region Create parameters
Parameters.Add(new LookupParameter("ProblemInstance", "The problem instance."));
Parameters.Add(new ScopeTreeLookupParameter("Distance", "The distance of the VRP solutions which should be analyzed."));
Parameters.Add(new ValueLookupParameter("BestDistance", "The best distance value."));
Parameters.Add(new ValueLookupParameter("CurrentBestDistance", "The current best distance value."));
Parameters.Add(new ValueLookupParameter("CurrentAverageDistance", "The current average distance value of all solutions."));
Parameters.Add(new ValueLookupParameter("CurrentWorstDistance", "The current worst distance value of all solutions."));
Parameters.Add(new ValueLookupParameter("Distances", "The data table to store the current best, current average, current worst, best and best known distance value."));
Parameters.Add(new ScopeTreeLookupParameter("VehiclesUtilized", "The vehicles utilized of the VRP solutions which should be analyzed."));
Parameters.Add(new ValueLookupParameter("BestVehiclesUtilized", "The best vehicles utilized value."));
Parameters.Add(new ValueLookupParameter("CurrentBestVehiclesUtilized", "The current best vehicles utilized value."));
Parameters.Add(new ValueLookupParameter("CurrentAverageVehiclesUtilized", "The current average vehicles utilized value of all solutions."));
Parameters.Add(new ValueLookupParameter("CurrentWorstVehiclesUtilized", "The current worst vehicles utilized value of all solutions."));
Parameters.Add(new ValueLookupParameter("VehiclesUtilizedValues", "The data table to store the current best, current average, current worst, best and best known vehicles utilized value."));
Parameters.Add(new ValueLookupParameter("Results", "The results collection where the analysis values should be stored."));
#endregion
#region Create operators
BestVRPToursMemorizer bestMemorizer = new BestVRPToursMemorizer();
BestAverageWorstVRPToursCalculator calculator = new BestAverageWorstVRPToursCalculator();
ResultsCollector resultsCollector = new ResultsCollector();
//Distance
bestMemorizer.BestDistanceParameter.ActualName = BestDistanceParameter.Name;
bestMemorizer.DistanceParameter.ActualName = DistanceParameter.Name;
bestMemorizer.DistanceParameter.Depth = DistanceParameter.Depth;
calculator.DistanceParameter.ActualName = DistanceParameter.Name;
calculator.DistanceParameter.Depth = DistanceParameter.Depth;
calculator.BestDistanceParameter.ActualName = CurrentBestDistanceParameter.Name;
calculator.AverageDistanceParameter.ActualName = CurrentAverageDistanceParameter.Name;
calculator.WorstDistanceParameter.ActualName = CurrentWorstDistanceParameter.Name;
DataTableValuesCollector distanceDataTablesCollector = new DataTableValuesCollector();
distanceDataTablesCollector.CollectedValues.Add(new LookupParameter("BestDistance", null, BestDistanceParameter.Name));
distanceDataTablesCollector.CollectedValues.Add(new LookupParameter("CurrentBestDistance", null, CurrentBestDistanceParameter.Name));
distanceDataTablesCollector.CollectedValues.Add(new LookupParameter("CurrentAverageDistance", null, CurrentAverageDistanceParameter.Name));
distanceDataTablesCollector.CollectedValues.Add(new LookupParameter("CurrentWorstDistance", null, CurrentWorstDistanceParameter.Name));
distanceDataTablesCollector.DataTableParameter.ActualName = DistancesParameter.Name;
resultsCollector.CollectedValues.Add(new LookupParameter(DistancesParameter.Name));
//Vehicles Utlized
bestMemorizer.BestVehiclesUtilizedParameter.ActualName = BestVehiclesUtilizedParameter.Name;
bestMemorizer.VehiclesUtilizedParameter.ActualName = VehiclesUtilizedParameter.Name;
bestMemorizer.VehiclesUtilizedParameter.Depth = VehiclesUtilizedParameter.Depth;
calculator.VehiclesUtilizedParameter.ActualName = VehiclesUtilizedParameter.Name;
calculator.VehiclesUtilizedParameter.Depth = VehiclesUtilizedParameter.Depth;
calculator.BestVehiclesUtilizedParameter.ActualName = CurrentBestVehiclesUtilizedParameter.Name;
calculator.AverageVehiclesUtilizedParameter.ActualName = CurrentAverageVehiclesUtilizedParameter.Name;
calculator.WorstVehiclesUtilizedParameter.ActualName = CurrentWorstVehiclesUtilizedParameter.Name;
DataTableValuesCollector vehiclesUtilizedDataTablesCollector = new DataTableValuesCollector();
vehiclesUtilizedDataTablesCollector.CollectedValues.Add(new LookupParameter("BestVehiclesUtilized", null, BestVehiclesUtilizedParameter.Name));
vehiclesUtilizedDataTablesCollector.CollectedValues.Add(new LookupParameter("CurrentBestVehiclesUtilized", null, CurrentBestVehiclesUtilizedParameter.Name));
vehiclesUtilizedDataTablesCollector.CollectedValues.Add(new LookupParameter("CurrentAverageVehiclesUtilized", null, CurrentAverageVehiclesUtilizedParameter.Name));
vehiclesUtilizedDataTablesCollector.CollectedValues.Add(new LookupParameter("CurrentWorstVehiclesUtilized", null, CurrentWorstVehiclesUtilizedParameter.Name));
vehiclesUtilizedDataTablesCollector.DataTableParameter.ActualName = VehiclesUtilizedValuesParameter.Name;
resultsCollector.CollectedValues.Add(new LookupParameter(VehiclesUtilizedValuesParameter.Name));
#endregion
#region Create operator graph
OperatorGraph.InitialOperator = bestMemorizer;
bestMemorizer.Successor = calculator;
calculator.Successor = distanceDataTablesCollector;
distanceDataTablesCollector.Successor = vehiclesUtilizedDataTablesCollector;
vehiclesUtilizedDataTablesCollector.Successor = resultsCollector;
resultsCollector.Successor = null;
#endregion
Initialize();
}
[StorableConstructor]
private BestAverageWorstVRPToursAnalyzer(bool deserializing) : base() { }
public override IDeepCloneable Clone(Cloner cloner) {
return new BestAverageWorstVRPToursAnalyzer(this, cloner);
}
private BestAverageWorstVRPToursAnalyzer(BestAverageWorstVRPToursAnalyzer original, Cloner cloner)
: base(original, cloner) {
this.Initialize();
}
[StorableHook(HookType.AfterDeserialization)]
private void Initialize() {
DistanceParameter.DepthChanged += new EventHandler(DistanceParameter_DepthChanged);
VehiclesUtilizedParameter.DepthChanged += new EventHandler(VehiclesUtilizedParameter_DepthChanged);
}
void DistanceParameter_DepthChanged(object sender, EventArgs e) {
BestAverageWorstCalculator.DistanceParameter.Depth = DistanceParameter.Depth;
BestMemorizer.DistanceParameter.Depth = DistanceParameter.Depth;
}
void VehiclesUtilizedParameter_DepthChanged(object sender, EventArgs e) {
BestAverageWorstCalculator.VehiclesUtilizedParameter.Depth = VehiclesUtilizedParameter.Depth;
BestMemorizer.VehiclesUtilizedParameter.Depth = DistanceParameter.Depth;
}
}
}