public Link FindLink(City u, City n, Link.TransportModeEnum tmode) { return(links.Find(l => l.FromCity.Equals(u) && l.ToCity.Equals(n) || l.ToCity.Equals(u) && l.FromCity.Equals(n))); }
public Link FindLink(City from, City to, Link.TransportModeEnum t) { return(links.Find(l => (l.FromCity.Equals(from) && l.ToCity.Equals(to) || l.FromCity.Equals(to) && l.ToCity.Equals(from)) && l.TransportMode == t)); }
public IEnumerable <City> FindNeighbors(City u, Link.TransportModeEnum tmode) { return((from l in links where l.FromCity.Equals(u) select l.ToCity).Union( from l in links where l.ToCity.Equals(u) select l.FromCity).ToList()); }
public List <City> FindNeighbours(City c, Link.TransportModeEnum t) { return((from l in links where l.FromCity.Equals(c) select l.ToCity).Union( from l in links where l.ToCity.Equals(c) select l.FromCity).ToList()); }
/** find shortest path between source to target city * {@link http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm} * * @return itinerary */ public Link[] FindShortestRouteBetween(string fromName, String toName, Link.TransportModeEnum tmode) { City source = cityRepository.FindByName(fromName); City target = cityRepository.FindByName(toName); if (notifiers != null) { notifiers(source, target); } List <City> cities = cityRepository.FindCitiesBetween( source, target); if (cities.Count < 1) { return(null); } List <City> Q = new List <City>(); Dictionary <City, Double> dist = new Dictionary <City, Double>(); Dictionary <City, City> previous = new Dictionary <City, City>(); foreach (City v in cities) { dist[v] = double.MaxValue; previous[v] = null; Q.Add(v); } dist[source] = 0.0; while (Q.Count > 0) { City u = null; double minDist = double.MaxValue; // find city u with smallest dist foreach (City c in Q) { if (dist[c] < minDist) { u = c; minDist = dist[c]; } } if (u == null) { break; } Q.Remove(u); foreach (City n in linkRepository.FindNeighbours(u, tmode)) { Link l = linkRepository.FindLink(u, n, tmode); double d = dist[u]; if (l != null) { d += l.Distance; } else { d += double.MaxValue; } if (dist.ContainsKey(n) && d < dist[n]) { dist[n] = d; previous[n] = u; } } } return(createItinerary(source, target, previous)); }