public void Update(Connection C, TravelMode Modes, Node Target = null) { v = C.GetDestination(); if (ObjValues.ContainsKey(v)) { return; // already processed } if (!Q.TryGetPriority(v, out crntObjValue)) { crntObjValue = double.PositiveInfinity; } double ObjValue = 0.0; if (Func == ObjFunction.Distance) { ObjValue = GetObjValueBasedOnDistance(C, Modes); } else if (Func == ObjFunction.Time) { ObjValue = GetObjValueBasedOnTime(C, Modes); } else if (Func == ObjFunction.Weighted) { ObjValue = GetWeightedObjValue(C, Modes); } /* Check if the PT of this connection was already taken or there is at least one carpooling leg on the previous connections */ /* WARNING: this function would take too much time to run */ //bool cutConnection = false; //cutConnection = checkConstraints(C); //if (cutConnection) // ObjValue = double.PositiveInfinity; if (ObjValue < crntObjValue) { Q[v] = ObjValue; if (Parent.ContainsKey(v)) { Parent[v] = C; ArrivalTime[v] = ArrivalTime[C.GetSource()] + C.GetTravelTime(Date, ArrivalTime[C.GetSource()], Modes); } else { Parent.Add(v, C); ArrivalTime.Add(v, ArrivalTime[C.GetSource()] + C.GetTravelTime(Date, ArrivalTime[C.GetSource()], Modes)); } } }
private void RunDijkstra() { Satsuma.PriorityQueue <HiddenMarkovState, double> Q = new Satsuma.PriorityQueue <HiddenMarkovState, double>(); Dictionary <HiddenMarkovState, double> distance = new Dictionary <HiddenMarkovState, double>(); Dictionary <HiddenMarkovState, HiddenMarkovState> parent = new Dictionary <HiddenMarkovState, HiddenMarkovState>(); if (!parent.ContainsKey(s)) { parent.Add(s, null); } else { parent[s] = null; } Q[s] = 0.0; while (Q.Count != 0) { // find the closest reached but unfixed node double minDist; HiddenMarkovState min = Q.Peek(out minDist); Q.Pop(); /// fix the node. if (!distance.ContainsKey(min)) { distance.Add(min, minDist); } else { distance[min] = minDist; // fix the node } if (min == t) { break; // target node found and fixed. } foreach (HiddenMarkovState v in min.AdjacencyList) { if (distance.ContainsKey(v)) { continue; // already processed } double newDist = minDist + min.StateCost() + EdgeCost(min, v); double oldDist; if (!Q.TryGetPriority(v, out oldDist)) { oldDist = double.PositiveInfinity; } if (newDist < oldDist) { Q[v] = newDist; if (parent.ContainsKey(v)) { parent[v] = min; } else { parent.Add(v, min); } } } } // Construct Solution. HiddenMarkovState S = parent[t]; while (S != null) { //if (S.GetUnderlyingRNode() != null); MatchingSolution.AddFirst(S.GetUnderlyingRNode()); S = parent[S]; } }