Beispiel #1
0
        /// <summary>
        /// Nâng cấp các đỉnh có cạnh nối đến node tìm ra
        /// </summary>
        /// <param name="node"></param>
        /// <param name="listnode"></param>
        private void ImprovePaths(Dijktra_node node, List <Dijktra_node> listnode)
        {
            // Lấy index node vừa thêm
            int index = node.index;

            if (!m_DListNode.ContainsKey(index))
            {
                return;
            }


            // Lấy ds các node được kết nối với node vừa chọn
            for (int i = 0; i < m_DListNode[index].Count; i++)
            {
                // Trong ds các node liên kết với node được chọn
                for (int j = 0; j < listnode.Count; j++)
                {
                    // nếu node nào thuộc T mới update
                    if (listnode[j].check)
                    {
                        // Nếu là node có kết nối đến node được chọn thì tiếp tục
                        if (m_DListNode[index][i].GetTo() == listnode[j].index)
                        {
                            //float tempdis = 0;
                            //if (listnode[j].lenght == -1)
                            //{
                            //    tempdis = 0;
                            //}
                            //else
                            //{
                            //    tempdis = m_DListNode[index][i].GetCost();
                            //}
                            // Tinhs khoảng cách từ đỉnh vừa chọn đến đỉnh có cạnh nối
                            float dist = node.lenght + m_DListNode[index][i].GetCost();
                            if (listnode[j].lenght == -1 || listnode[j].lenght > dist)
                            {
                                listnode[j].lenght  = dist;
                                listnode[j].preNode = index;
                            }
                        }
                    }
                }
            }
        }
Beispiel #2
0
        public List <MyGraphEdge> FindTheShortestPath(int fromNode, int toNode)
        {
            List <Dijktra_node> BeyoundT = new List <Dijktra_node>();
            Dijktra_node        f_fromNode = new Dijktra_node(), f_toNode = new Dijktra_node();
            List <MyGraphEdge>  result = new List <MyGraphEdge>();

            Dijktra_init(fromNode, toNode, ref f_fromNode, ref f_toNode, BeyoundT);
            int last_node = fromNode;

            // Trong khi chưa đạt đến đích thì tiếp tục
            while (f_toNode.check)
            {
                Dijktra_node node = DijktraFindEdge(BeyoundT);
                if (node == null)
                {
                    break;
                }
                ImprovePaths(node, BeyoundT);
            }

            result = UpdatePath(BeyoundT, fromNode, toNode);
            return(result);
        }
Beispiel #3
0
        private void Dijktra_init(int fromNode, int toNode, ref Dijktra_node f_fromNode, ref Dijktra_node f_toNode, List <Dijktra_node> BeyoundT)
        {
            for (int i = 0; i < this.m_Nodes.Count; i++)
            {
                Dijktra_node node = new Dijktra_node();
                node.index   = this.m_Nodes[i].getIndex();
                node.check   = true;
                node.lenght  = -1;
                node.preNode = -1;

                if (fromNode == node.index)
                {
                    f_fromNode        = node;
                    f_fromNode.lenght = 0;
                }

                if (toNode == node.index)
                {
                    f_toNode = node;
                }

                BeyoundT.Add(node);
            }
        }
Beispiel #4
0
        /// <summary>
        /// Nâng cấp các đỉnh có cạnh nối đến node tìm ra
        /// </summary>
        /// <param name="node"></param>
        /// <param name="listnode"></param>
        private void ImprovePaths(Dijktra_node node, List<Dijktra_node> listnode)
        {
            // Lấy index node vừa thêm
            int index = node.index;

            if (!m_DListNode.ContainsKey(index))
            {
                return;
            }

            // Lấy ds các node được kết nối với node vừa chọn
            for (int i = 0; i < m_DListNode[index].Count; i++)
            {
                // Trong ds các node liên kết với node được chọn
                for (int j = 0; j < listnode.Count; j++)
                {
                    // nếu node nào thuộc T mới update
                    if (listnode[j].check)
                    {
                        // Nếu là node có kết nối đến node được chọn thì tiếp tục
                        if (m_DListNode[index][i].GetTo() == listnode[j].index)
                        {
                            //float tempdis = 0;
                            //if (listnode[j].lenght == -1)
                            //{
                            //    tempdis = 0;
                            //}
                            //else
                            //{
                            //    tempdis = m_DListNode[index][i].GetCost();
                            //}
                            // Tinhs khoảng cách từ đỉnh vừa chọn đến đỉnh có cạnh nối
                            float dist = node.lenght + m_DListNode[index][i].GetCost();
                            if (listnode[j].lenght == -1||listnode[j].lenght > dist)
                            {
                                listnode[j].lenght = dist;
                                listnode[j].preNode = index;
                            }
                        }
                    }
                }
            }
        }
Beispiel #5
0
        private void Dijktra_init(int fromNode, int toNode, ref Dijktra_node f_fromNode, ref Dijktra_node f_toNode, List<Dijktra_node> BeyoundT)
        {
            for (int i = 0; i < this.m_Nodes.Count; i++)
            {
                Dijktra_node node = new Dijktra_node();
                node.index = this.m_Nodes[i].getIndex();
                node.check = true;
                node.lenght = -1;
                node.preNode = -1;

                if (fromNode == node.index)
                {
                    f_fromNode = node;
                    f_fromNode.lenght = 0;
                }

                if (toNode == node.index)
                {
                    f_toNode = node;
                }

                BeyoundT.Add(node);
            }
        }
Beispiel #6
0
        public List<MyGraphEdge> FindTheShortestPath(int fromNode, int toNode)
        {
            List<Dijktra_node> BeyoundT = new List<Dijktra_node>();
            Dijktra_node f_fromNode = new Dijktra_node(), f_toNode = new Dijktra_node();
            List<MyGraphEdge> result = new List<MyGraphEdge>();

            Dijktra_init(fromNode, toNode, ref f_fromNode, ref f_toNode, BeyoundT);
            int last_node = fromNode;
            // Trong khi chưa đạt đến đích thì tiếp tục
            while (f_toNode.check)
            {
                Dijktra_node node = DijktraFindEdge(BeyoundT);
                if (node == null)
                {
                    break;
                }
                ImprovePaths(node, BeyoundT);
            }

            result = UpdatePath(BeyoundT, fromNode, toNode);
            return result;
        }