Пример #1
0
 public AddResult(Schedule s, Order order, int orderIndex, Node nextTo, int loopIndex, int dayIndex, int truckIndex, double delta) : base(s)
 {
     this.order      = order;
     this.orderIndex = orderIndex;
     nextTos         = new List <Node>()
     {
         nextTo
     };
     loopIndices = new List <int>()
     {
         loopIndex
     };
     dayIndices = new List <int>()
     {
         dayIndex
     };
     truckIndices = new List <int>()
     {
         truckIndex
     };
     deltas = new List <double>()
     {
         delta
     };
 }
Пример #2
0
        public override void ApplyOperator()
        {
            state.Days[day, truck].RemoveNodeFromLoop(toDelete, loop);
            Order o = toDelete.Data;

            state.totalTime    += (delta - 4 * o.Frequency * o.TimeToEmpty); // Delta should be only change in drivetime, so should not include the penalty.
            state.totalPenalty += 3 * o.Frequency * o.TimeToEmpty;
            state.nonPlannedOrders.Add(toDelete.Data);
        }
Пример #3
0
 public AddResult(Schedule s, Order order, int orderIndex, List <Node> nextTos, List <int> loopIndices, List <int> dayIndices, List <int> truckIndices, List <double> deltas) : base(s)
 {
     this.order        = order;
     this.orderIndex   = orderIndex;
     this.nextTos      = nextTos;
     this.loopIndices  = loopIndices;
     this.dayIndices   = dayIndices;
     this.truckIndices = truckIndices;
     this.deltas       = deltas;
 }
Пример #4
0
        public Node AddOrderToLoop(Order order, Node nextTo, int loopIndex)
        {
            //Console.WriteLine($"Timeleft before AddOrder: {Loops[loopIndex].Duration}");
            TimeLeft += Loops[loopIndex].Duration;

            Node res = Loops[loopIndex].AddOrder(order, nextTo);

            TimeLeft -= Loops[loopIndex].Duration;
            return(res);
        }
Пример #5
0
        public Node AppendNext(Order o)
        {
            Node n = new Node(o)
            {
                Prev = this,
                Next = Next
            };

            Next.Prev = n;
            Next      = n;
            return(n);
        }
Пример #6
0
        public Node AddOrder(Order order, Node nextTo)
        {
            Cluster   = order.Cluster;
            Duration += (order.TimeToEmpty
                         + GD.JourneyTime[nextTo.Data.MatrixId, order.MatrixId]
                         + GD.JourneyTime[order.MatrixId, nextTo.Next.Data.MatrixId]
                         - GD.JourneyTime[nextTo.Data.MatrixId, nextTo.Next.Data.MatrixId]);
            Node n = nextTo.AppendNext(order);

            RoomLeft -= (order.NumContainers * order.VolPerContainer * 0.2);
            Count++;
            return(n);
        }
Пример #7
0
        public bool EvaluateOptimalAddition(Order order, out Node opt, out double newRoomLeft, out double td, Node excluded)
        {
            td          = 0;
            opt         = null;
            newRoomLeft = RoomLeft - (order.NumContainers * order.VolPerContainer) * 0.2; // Het gecomprimeerde gewicht dat erbij zou komen

            if (newRoomLeft <= 0)
            {
                return(false);                     // Toevoegen zal de gewichtsconstraint schenden
            }
            double best = GD.JourneyTime[order.MatrixId, Start.Data.MatrixId];

            opt = Start;
            Node curr = Start.Next;

            while (!curr.IsDump)
            {
                if (excluded != null && curr.Data.OrderId == excluded.Data.OrderId)
                {
                    //Console.WriteLine("Encountered " + curr.Data.OrderId);
                    curr = curr.Next;
                    continue;
                }
                double t = GD.JourneyTime[order.MatrixId, curr.Data.MatrixId];
                if (t < best)
                {
                    opt  = curr;
                    best = t;
                }
                curr = curr.Next;
            }

            double tNext = GD.JourneyTime[order.MatrixId, opt.Next.Data.MatrixId];
            double tPrev = GD.JourneyTime[order.MatrixId, opt.Prev.Data.MatrixId];

            if (tPrev < tNext && (excluded != null && opt.Data.OrderId == excluded.Data.OrderId))
            {
                opt = opt.Prev;
            }

            td = (order.TimeToEmpty
                  + GD.JourneyTime[opt.Data.MatrixId, order.MatrixId]
                  + GD.JourneyTime[order.MatrixId, opt.Next.Data.MatrixId]
                  - GD.JourneyTime[opt.Data.MatrixId, opt.Next.Data.MatrixId]);

            return(true);
        }
Пример #8
0
        public bool EvaluateAddition(Order order, out Node bestNode, out double bestDeltaTime, out int bestLoop, bool evaluateCluster = false, Node excluded = null)
        {
            bestNode      = null;
            bestDeltaTime = double.MaxValue;
            bestLoop      = -1;

            for (int i = 0; i < Loops.Count; i++)
            {
                Loop loop = Loops[i];
                if (evaluateCluster && loop.Cluster != -1 && loop.Cluster != order.Cluster)
                {
                    continue;
                }
                if (loop.EvaluateOptimalAddition(order, out Node lOpt, out double _, out double lTd, excluded))
                {
                    if (TimeLeft >= lTd && lTd < bestDeltaTime)
                    {
                        bestNode      = lOpt;
                        bestDeltaTime = lTd;
                        bestLoop      = i;
                    }
                }
            }
            if (order.JourneyTimeFromDump + order.JourneyTimeToDump + order.TimeToEmpty + 30 <= TimeLeft && order.JourneyTimeFromDump + order.JourneyTimeToDump + order.TimeToEmpty + 30 <= bestDeltaTime)
            {
                AddLoop();
                TimeLeft     -= 30;
                bestLoop      = Loops.Count - 1;
                bestDeltaTime = order.JourneyTimeFromDump + order.JourneyTimeToDump + order.TimeToEmpty + 30;
                bestNode      = Loops[bestLoop].Start;
            }
            if (bestLoop == -1)
            {
                if (order.JourneyTimeFromDump + order.JourneyTimeToDump + order.TimeToEmpty + 30 <= TimeLeft) // Check if adding new loop helps
                {
                    AddLoop();
                    TimeLeft     -= 30;
                    bestLoop      = Loops.Count - 1;
                    bestDeltaTime = order.JourneyTimeFromDump + order.JourneyTimeToDump + order.TimeToEmpty + 30;
                    bestNode      = Loops[bestLoop].Start;
                }
                return(false);
            }
            return(true);
        }
Пример #9
0
        public void RemoveNode(Node n)
        {
            Order order = n.Data;

            Duration -= order.TimeToEmpty + GD.JourneyTime[n.Prev.Data.MatrixId, order.MatrixId] + GD.JourneyTime[order.MatrixId, n.Next.Data.MatrixId];
            Duration += GD.JourneyTime[n.Prev.Data.MatrixId, n.Next.Data.MatrixId];
            //n.Remove();
            Node p = n.Next;


            n.Next.Prev = n.Prev;
            n.Prev.Next = n.Next;
            n.Prev      = null;
            n.Next      = null;

            RoomLeft += (order.NumContainers * order.VolPerContainer * 0.2);
            Count--;
        }
Пример #10
0
 public Node(Order o)
 {
     IsDump = false;
     Data   = o;
 }
Пример #11
0
 public Node()
 {
     IsDump = true;
     Data   = GD.Dump;
     Prev   = Next = this;
 }
Пример #12
0
        public override double GetTotalDelta()
        {
            Order o = toDelete.Data;

            return((delta - 4 * o.Frequency * o.TimeToEmpty) + 3 * o.Frequency * o.TimeToEmpty);
        }