Exemplo n.º 1
0
 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)));
 }
Exemplo n.º 2
0
 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));
 }
Exemplo n.º 3
0
 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());
 }
Exemplo n.º 4
0
 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());
 }
Exemplo n.º 5
0
        /** 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));
        }