using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using HeuristicLab.Common; using HeuristicLab.Core; using HeuristicLab.Encodings.RealVectorEncoding; using HeuristicLab.Parameters; using HeuristicLab.PDPSimulation.DomainModel; using HeuristicLab.PDPSimulation.Operators; using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; namespace HeuristicLab.PDPSimulation { [Item("LinearPriorityDispatching", "")] [StorableClass] public class LinearPriorityDispatching : PriorityDispatching { public IValueLookupParameter WeightsParameter { get { return (IValueLookupParameter)Parameters["Weights"]; } } [StorableConstructor] protected LinearPriorityDispatching(bool deserializing) : base(deserializing) { } protected LinearPriorityDispatching(PriorityDispatching original, Cloner cloner) : base(original, cloner) { } public LinearPriorityDispatching() { Parameters.Add(new ValueLookupParameter("Weights", "The weights for the individual priorities.")); WeightsParameter.Value = new RealVector(new double[] { 100.000, 100.000, 22.349, 74.573, 18.424, 28.913, 0.331, 91.323, 36.969, 44.992, 64.892, 30.736, 23.113, 36.458, 6.178, 99.065, 100.0, 100.0 }); } public override IDeepCloneable Clone(Cloner cloner) { return new LinearPriorityDispatching(this, cloner); } protected override double CalculatePriority(IDictionary variables) { var weights = WeightsParameter.Value; double prio = weights[0] * variables["DueDate"] + weights[1] * variables["StartDate"] + weights[2] * variables["PickupOrdersAtTarget"] + weights[3] * variables["Distance"] + weights[4] * variables["AverageDistanceToDestinations"] + weights[5] * variables["MinimumDistanceToDestinations"] + weights[6] * variables["MaximumDistanceToDestinations"] + weights[7] * variables["NumberOfOtherCouriersToTarget"] + weights[8] * variables["AverageDistanceToOtherCouriers"] + weights[9] * variables["EarliestTimeOfArrival"] + weights[10] * variables["DeliveryOrdersAtTarget"] + weights[11] * variables["PickupOrderItemsAtTarget"] + weights[12] * variables["DeliveryOrderItemsAtTarget"] + weights[13] * variables["MinimumDistanceToOtherCouriers"] + weights[14] * variables["MaximumDistanceToOtherCouriers"] + weights[15] * variables["DemandSize"] + weights[16] * variables["EDD"] + weights[17] * variables["LeadTime"]; return prio; } } }