示例#1
0
        public override void Execute()
        {
            openset.Enqueue(new PriorityQueueState(CurrentState), 0);
            cost_so_far.Add(CurrentState.Key, 0);
            Console.WriteLine("Initial State:");

            CurrentState.Format();

            watch = new Stopwatch();
            watch.Start();
            while (openset.Count > 0)
            {
                var currentnode = openset.Dequeue();
                CurrentState = currentnode.NodeState;
                if (CurrentState.IsEqualToGoal())
                {
                    watch.Stop();

                    SolutionFound(CurrentState);

                    Console.WriteLine("Elapsed time: {0} ms", watch.Elapsed.Milliseconds);
                    return;
                }
                else
                {
                    var children = CurrentState.BuildChildren();

                    foreach (var child in children)
                    {
                        var new_cost = cost_so_far[CurrentState.Key] + 1; //1 refers to the distance between the current node and its childrens
                        if (!cost_so_far.ContainsKey(child.Key) || new_cost < cost_so_far[child.Key])
                        {
                            cost_so_far[child.Key] = new_cost;

                            int priority = 0;

                            if (use_manhattan)
                            {
                                priority = new_cost + ManVal(child.StateArray);
                            }
                            else
                            {
                                priority = new_cost + HammingDistance(child.StateArray);
                            }

                            openset.Enqueue(new PriorityQueueState(child), (double)priority);

                            if (!parents.ContainsKey(child.Key))
                            {
                                parents[child.Key] = CurrentState;
                            }
                        }
                    }
                }
            }
        }
示例#2
0
        public void TestPeekVCount()
        {
            queue u3 = new queue(10);

            u3.Enqueue(1);
            u3.Enqueue(2);
            u3.Enqueue(3);
            Assert.AreEqual(1, u3.peek());
            Assert.AreEqual(3, u3.checkCount());
        }
示例#3
0
        public void TestCreatQueue()
        {
            queue u1 = new queue(10);

            u1.Enqueue(1);
            u1.Enqueue(2);
            u1.Enqueue(3);
            u1.Enqueue(4);
            Assert.AreEqual(4, u1.checkCount());
        }
示例#4
0
        static void Main(string[] args)
        {
            queue user = new queue(10);

            user.Enqueue(1);
            user.Enqueue(2);
            user.Enqueue(3);
            user.Enqueue(4);
            user.Enqueue(5);
            Console.WriteLine(@"----The count at begin when user push ell");
            user.checkCount();
            //  user Dequeue 1 element
            Console.WriteLine(@"----Dequeue-----");
            user.Dequeue();
            Console.WriteLine(@"----Check count after Dequeue----");

            /*  check count after dequeue ( the count will -1 element after Dequeue )
             *  when user Dequeue ele that ele will go out the Queue
             */
            user.checkCount();
            //  user wanna peek in queue
            Console.WriteLine(@"----Peek----");
            user.peek();
            //  peek different than Dequeue because : when user peek the count not change;
            Console.WriteLine(@"-----Check count afete Peek-----");
            user.checkCount();
            // push 1 ele
            user.Enqueue(6);
            user.Enqueue(7);
            user.Enqueue(8);
            user.Enqueue(9);
            Console.WriteLine(@"-----The count after Enqueue-----");
            // then check count ? is it changing ?
            user.checkCount();
        }
示例#5
0
        public void TestDequeue()
        {
            queue u2 = new queue(10);

            u2.Enqueue(1);
            u2.Enqueue(2);
            u2.Enqueue(3);
            u2.Enqueue(4);
            Assert.AreEqual(1, u2.Dequeue());
            Assert.AreEqual(2, u2.Dequeue());
        }
示例#6
0
        public override void Execute()
        {
            openset.Enqueue(new PriorityQueueState(CurrentState), 0);
            Console.WriteLine("Initial State:");

            CurrentState.Format();

            watch = new Stopwatch();
            watch.Start();
            while (openset.Count > 0)
            {
                var currentnode = openset.Dequeue();
                CurrentState = currentnode.NodeState;
                if (CurrentState.IsEqualToGoal())
                {
                    watch.Stop();

                    SolutionFound(CurrentState);

                    Console.WriteLine("Elapsed time: {0} ms", watch.Elapsed.Milliseconds);
                    return;
                }
                else
                {
                    var children = CurrentState.BuildChildren();

                    foreach (var child in children)
                    {
                        if (!parents.ContainsKey(child.Key))
                        {
                            int priority = ManVal(child.StateArray);
                            openset.Enqueue(new PriorityQueueState(child), (double)priority);
                            parents[child.Key] = CurrentState;
                        }
                    }
                }
            }
        }
示例#7
0
 /// <summary>
 /// 添加数据
 /// </summary>
 /// <param name="nodes"></param>
 void push(node[] nodes)
 {
     Interlocked.Decrement(ref thread);
     while (thread != 0)
     {
         Thread.Sleep(0);
     }
     foreach (node node in nodes)
     {
         if ((node.Value & 1023) == 0)
         {
             Thread.Sleep(0);
         }
         queue.Enqueue(node);
     }
     pushEnd = 1;
     Console.WriteLine("push end");
 }
示例#8
0
 /// <summary>
 /// 添加数据
 /// </summary>
 /// <param name="nodes"></param>
 void push(node[] nodes)
 {
     Interlocked.Decrement(ref pushThread);
     while (pushThread != 0)
     {
         Thread.Sleep(0);
     }
     foreach (node node in nodes)
     {
         if ((node.Value & 1023) == 0)
         {
             Thread.Sleep(0);
         }
         queue.Enqueue(node);
     }
     if (Interlocked.Decrement(ref pushEndThread) == 0)
     {
         Console.WriteLine("concurrent push end");
     }
 }