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); }
public LabelInfo(CapacityResourceInfo capacity, bool[] unreachables, int unreachablesAmount, double cost, Route partial) { CapacityInfo = capacity; UnreachableNodes = unreachables; UnreachableNodesAmount = unreachablesAmount; Cost = cost; PartialRoute = (Route)partial.Clone(); }
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); }
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)); }
private bool IsWeakExtension(CapacityResourceInfo currentResourceInfo, int id, double capacity) { return(currentResourceInfo.CurrentDelivery + ProblemData.Clients[id].Delivery <= capacity && currentResourceInfo.CurrentPickup + ProblemData.Clients[id].Pickup <= capacity); }
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); }