Example #1
0
        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");
         }
     }
 }
Example #3
0
 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;
 }