Пример #1
0
        /// <summary>
        /// currentNode-ból gyaloglással elérhető csomópontok és azok költsége (incompleteNodes-ból válogatva)
        /// </summary>
        /// <param name="currentNode"></param>
        /// <param name="incompleteNodes"></param>
        /// <param name="when"></param>
        /// <returns></returns>
        protected List <CompleteNode> GetTransferCandidates(CompleteNode currentNode, List <Node> incompleteNodes, DateTime when)
        {
            var candidates = new List <CompleteNode>();

            if ((currentNode.usedEdges.Count > 0) && (currentNode.usedEdges.Peek() is TransferEdge))
            {
                // Ha az előző művelet átszállás volt, akkor ne szálljunk át mégegyszer
                return(candidates);
            }

            int?groupId = GetStop(currentNode.stopId).GroupId;

            if (groupId != null)
            {
                var stopsInGroup = GetStopsInGroup(groupId);
                if (stopsInGroup == null)
                {
                    // Ha árva vagyok, akkor üreset adok vissza
                    return(candidates);
                }

                // Szomszédok vizsgálata
                foreach (var stop in stopsInGroup)
                {
                    if (stop.DbId == currentNode.stopId)
                    {
                        // Saját magunkkal nem foglalkozunk
                        continue;
                    }

                    if (!incompleteNodes.Exists(ic => ic.stopId == stop.DbId))
                    {
                        // Csak akkor foglalkozzunk vele, ha még nem dolgoztuk fel
                        continue;
                    }

                    var edge     = new TransferEdge(stop.DbId, currentNode.departureTime, this.GetStop(currentNode.stopId), this.GetStop(stop.DbId));
                    var edgeCost = edge.GetCost();

                    if (edgeCost != null)
                    {
                        var usedEdges = new Stack <Edge>(currentNode.usedEdges.Reverse());
                        usedEdges.Push(edge);

                        candidates.Add(new CompleteNode
                        {
                            stopId        = stop.DbId,
                            viaNode       = currentNode,
                            departureTime = currentNode.departureTime.Add(TimeSpan.FromMinutes((int)edgeCost)),
                            usedEdges     = usedEdges,
                            usedRouteIds  = new Stack <int>(currentNode.usedRouteIds.Reverse())
                        });
                    }
                }
            }

            return(candidates);
        }
Пример #2
0
        /// <summary>
        /// currentNode-ból gyaloglással elérhető csomópontok és azok költsége (incompleteNodes-ból válogatva)
        /// </summary>
        /// <param name="currentNode"></param>
        /// <param name="incompleteNodes"></param>
        /// <param name="when"></param>
        /// <returns></returns>
        protected List<CompleteNode> GetTransferCandidates(CompleteNode currentNode, List<Node> incompleteNodes, DateTime when)
        {
            var candidates = new List<CompleteNode>();

            if ((currentNode.usedEdges.Count > 0) && (currentNode.usedEdges.Peek() is TransferEdge))
            {
                // Ha az előző művelet átszállás volt, akkor ne szálljunk át mégegyszer
                return candidates;
            }

            int? groupId = GetStop(currentNode.stopId).GroupId;

            if (groupId != null)
            {
                var stopsInGroup = GetStopsInGroup(groupId);
                if (stopsInGroup == null)
                {
                    // Ha árva vagyok, akkor üreset adok vissza
                    return candidates;
                }

                // Szomszédok vizsgálata
                foreach (var stop in stopsInGroup)
                {
                    if (stop.DbId == currentNode.stopId)
                    {
                        // Saját magunkkal nem foglalkozunk
                        continue;
                    }

                    if (!incompleteNodes.Exists(ic => ic.stopId == stop.DbId))
                    {
                        // Csak akkor foglalkozzunk vele, ha még nem dolgoztuk fel
                        continue;
                    }

                    var edge = new TransferEdge(stop.DbId, currentNode.departureTime, this.GetStop(currentNode.stopId), this.GetStop(stop.DbId));
                    var edgeCost = edge.GetCost();

                    if (edgeCost != null)
                    {
                        var usedEdges = new Stack<Edge>(currentNode.usedEdges.Reverse());
                        usedEdges.Push(edge);

                        candidates.Add(new CompleteNode
                        {
                            stopId = stop.DbId,
                            viaNode = currentNode,
                            departureTime = currentNode.departureTime.Add(TimeSpan.FromMinutes((int)edgeCost)),
                            usedEdges = usedEdges,
                            usedRouteIds = new Stack<int>(currentNode.usedRouteIds.Reverse())
                        });
                    }
                }
            }

            return candidates;
        }