public void Insert(Node_Define Node) { Node_Define Inserted_Node = Node; double[] key1 = new double[2]; key1[0] = Inserted_Node.key_list[0];//inserted Node key1[1] = Inserted_Node.key_list[1]; if (Node_List.Count > 0) { int checksum = 0; //int a = Math.Min(Node_List.Count, 4); for (int i = 0; i < Node_List.Count; i++) //for (int i = 0; i < a; i++) { Node_Define Checked_Node = (Node_Define)Node_List[i]; double[] key2 = new double[2]; key2[0] = Checked_Node.key_list[0]; //Exsisting node key2[1] = Checked_Node.key_list[1];//Existing node //if a <b, a is added before b, if a is the greatest, a is added at the end. if ((key1[0] < key2[0]) || (key1[0] == key2[0] && key1[1] < key2[1]))// Key1< key2 { Node_List.Insert(i, Node);//inserted Node has index i, checked node's index is increased automatically to i+1 break; } if (key1[0] == key2[0] && key1[1] == key2[1])// if key1 = key2, inserted node is till has index i, checked node's index is the same above { Node_List.Insert(i, Node); break; } checksum = checksum + 1; } //Add the greatest value to the end of array if (checksum == Node_List.Count) //if (checksum == a) { Node_List.Add(Node); } } else { Node_List.Add(Node); } // Console.WriteLine("Ulist elapsed:" + tt); }
private void Compute_Shortest_Path() { //Console.WriteLine(".....Compute_Shortest_Path...."); Console.WriteLine("Start ID: " + Start_ID); Node_Define TopNode = new Node_Define(); int Top_id = U.Top_Node(); if (Top_id >= 0) { TopNode = (Node_Define)Node[Top_id]; Console.WriteLine("TopNode :" + Top_id+ ": " + Node[Top_id].key_list[0] + "-" + Node[Top_id].key_list[1]); while ((Smaller_Key(TopNode.key_list, CalculateKey(Start_ID)) == true) || (Node[Start_ID].rhs != Node[Start_ID].G_Score)) { int Pop_id = U.Pop(); //be careful, if U_list is not Synced with Node in Main file, the G and rhs of a node in U_list Pop_id_list.Add(Pop_id); Console.WriteLine("Pop ID:" + Pop_id); if (Pop_id > -1) { Console.WriteLine("Pop_id :" + Pop_id); if (Smaller_Key(TopNode.key_list, CalculateKey(Pop_id)) == true) { Console.WriteLine("Kold < K new"); U.Insert(Node[Pop_id]); //Node_In_U_List.Add(Pop_id); } else if (Node[Pop_id].G_Score > Node[Pop_id].rhs) { //Console.WriteLine("else if G_Score > rhs"); Node[Pop_id].G_Score = Node[Pop_id].rhs; Predecessors(Pop_id);//In here, to be easy to understand for me, I use successors_nodes to impply Predecessors, and parrent node as Successors foreach (int Node_Element in Node[Pop_id].Predecessor_Node) { if (Node_Element > -1) { Node[Node_Element].Successors_List.Add(Pop_id); UpdateVertex(Node_Element); } } } else { //Console.WriteLine("else if G_Score <= rhs"); Node[Pop_id].G_Score = Infinite_Value; UpdateVertex(Pop_id); foreach (int Predecessor in Node[Pop_id].Predecessor_Node) { if (Predecessor > -1) { UpdateVertex(Predecessor); } } } } else break; Top_id = U.Top_Node(); //Console.WriteLine("Top_id:" + Top_id); if (Top_id > -1) { TopNode = (Node_Define)Node[Top_id]; } else Console.WriteLine("no more nodes"); } } }
private Node_Define Search_ID(int Node_ID) { Node_Define result = new Node_Define(); result.Node_ID = -1; for (int i = 0; i < Node_List.Count; i++) { if (Node_ID == ((Node_Define)Node_List[i]).Node_ID) { result = (Node_Define)Node_List[i]; return result; } } return result; }