/// <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; } } } } } }
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); }
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); } }
/// <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; } } } } } }
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); } }
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; }