public void AddOrder(Order order) { if (order.OrderNumber == 0) return; int LastMatrixID = 287; int NewMatrixID = order.MatrixID; int PreviousMatrixID = Orders.Count == 1 ? LastMatrixID : Orders[Orders.Count - 2].MatrixID; double OldTravelTime = TravelTime; TravelTime -= Data.DistanceMatrix[PreviousMatrixID, LastMatrixID].TravelTime; TravelTime += Data.DistanceMatrix[PreviousMatrixID, NewMatrixID].TravelTime; TravelTime += Data.DistanceMatrix[NewMatrixID, LastMatrixID].TravelTime; TravelTime += order.EmptyingTimeInSeconds; Weight += order.VolumePerContainer * order.NumberOfContainers; Orders.Insert(Orders.Count - 1, order); order.AddOrderOccurrence(this); if (partOfSolution != null) { partOfSolution.TravelTimeScore -= OldTravelTime - TravelTime; partOfSolution.AddPlannedOccurrence(order.OrderNumber, this); } }
public void AddOrderAt(Order newOrder, Order orderToInsertAfter) { if (newOrder.OrderNumber == 0 || orderToInsertAfter.OrderNumber == 0) return; int IndexOfOrderToInsertAfter = Orders.FindIndex(o => o.OrderNumber == orderToInsertAfter.OrderNumber); if (IndexOfOrderToInsertAfter == -1) return; if (IndexOfOrderToInsertAfter >= Orders.Count - 2) { AddOrder(newOrder); return; } int NextMatrixID = Orders[IndexOfOrderToInsertAfter + 1].MatrixID; int NewMatrixID = newOrder.MatrixID; int PreviousMatrixID = orderToInsertAfter.MatrixID; double OldTravelTime = TravelTime; TravelTime -= Data.DistanceMatrix[PreviousMatrixID, NextMatrixID].TravelTime; TravelTime += Data.DistanceMatrix[PreviousMatrixID, NewMatrixID].TravelTime; TravelTime += Data.DistanceMatrix[NewMatrixID, NextMatrixID].TravelTime; TravelTime += newOrder.EmptyingTimeInSeconds; Weight += newOrder.VolumePerContainer * newOrder.NumberOfContainers; Orders.Insert(IndexOfOrderToInsertAfter + 1, newOrder); newOrder.AddOrderOccurrence(this); if (partOfSolution != null) { partOfSolution.TravelTimeScore -= OldTravelTime - TravelTime; partOfSolution.AddPlannedOccurrence(newOrder.OrderNumber, this); } }