コード例 #1
0
        private CapacityResourceInfo GetCapacityExtension(CapacityResourceInfo currentResourceInfo, int clientID, double capacity)
        {
            if (IsWeakExtension(currentResourceInfo, clientID, capacity))/*en teoria esto siempre deberia ser true pq el nodo clientID no esta marcado como inalcanzable*/
            {
                double newDelivery = currentResourceInfo.CurrentDelivery + ProblemData.Clients[clientID].Delivery;

                double newPickup = currentResourceInfo.CurrentPickup + ProblemData.Clients[clientID].Pickup;
                double newLoad   = currentResourceInfo.MaxDelivery - newDelivery + newPickup;

                if (newDelivery <= currentResourceInfo.MaxDelivery) /*la carga inicial permite satisfacer la demanda de clientID*/
                {
                    if (newLoad <= capacity)                        /*el camino extendido hasta clientID es strong feasible*/
                    {
                        return(new CapacityResourceInfo(currentResourceInfo.MaxDelivery, newDelivery, newPickup));
                    }

                    double deltaLoad = newLoad - capacity;                          /*cto hay q disminour la carga inicial para garantizar factibilidad en clientID*/
                    if (currentResourceInfo.MaxDelivery - deltaLoad >= newDelivery) /*la reduccion en la carga inicial es factible*/
                    {
                        return(new CapacityResourceInfo(currentResourceInfo.MaxDelivery - deltaLoad, newDelivery, newPickup));
                    }
                    return(null);
                }
                return(null);
            }
            return(null);
        }
コード例 #2
0
 public LabelInfo(CapacityResourceInfo capacity, bool[] unreachables, int unreachablesAmount, double cost, Route partial)
 {
     CapacityInfo           = capacity;
     UnreachableNodes       = unreachables;
     UnreachableNodesAmount = unreachablesAmount;
     Cost         = cost;
     PartialRoute = (Route)partial.Clone();
 }
コード例 #3
0
        private bool IsUnreachable(CapacityResourceInfo currentResourceInfo, int id, double capacity)
        {
            if (id == 0)
            {
                return(false);
            }
            /*Factibilidad Debil*/
            if (!IsWeakExtension(currentResourceInfo, id, capacity))
            {
                return(true);
            }
            /*Factibilidad Fuerte*/
            CapacityResourceInfo strongExt = GetCapacityExtension(currentResourceInfo, id, capacity);

            return(strongExt == null);
        }
コード例 #4
0
        private LabelInfo ExtendStrongFeasible(double[,] reducedCost, LabelInfo currentLabel, int currentNode, int clientID, double capacity) /*extiende el label actual con el nodo clientID*/
        {
            CapacityResourceInfo resourceExt = GetCapacityExtension(currentLabel.CapacityInfo, clientID, capacity);

            if (resourceExt == null)
            {
                return(null); /*No es posible realizar una extension strong feasible*/
            }
            bool[] unreachablesExt = UpdateUnreachablesNodes(currentLabel.UnreachableNodes, clientID, resourceExt, capacity);
            Route  partial         = (Route)currentLabel.PartialRoute.Clone();

            if (clientID != 0)
            {
                partial.Add(clientID);
            }
            return(new LabelInfo(resourceExt, unreachablesExt, unreachablesExt.Count(x => x == true), currentLabel.Cost + reducedCost[currentNode, clientID], partial));
        }
コード例 #5
0
 private bool IsWeakExtension(CapacityResourceInfo currentResourceInfo, int id, double capacity)
 {
     return(currentResourceInfo.CurrentDelivery + ProblemData.Clients[id].Delivery <= capacity &&
            currentResourceInfo.CurrentPickup + ProblemData.Clients[id].Pickup <= capacity);
 }
コード例 #6
0
 private bool[] UpdateUnreachablesNodes(bool[] currentUnreachables, int clientID, CapacityResourceInfo newResourceInfo, double capacity)
 {
     bool[] newUnreachables = new bool[currentUnreachables.Length];
     for (int i = 0; i < newUnreachables.Length; i++)
     {
         if (i == clientID)
         {
             newUnreachables[i] = true;
         }
         else if (!currentUnreachables[i])
         {
             newUnreachables[i] = IsUnreachable(newResourceInfo, i, capacity);
         }
         else
         {
             newUnreachables[i] = true;
         }
     }
     return(newUnreachables);
 }