static void Main(string[] args)
        {
            ///////////    Uniform Cost //////////////////////

            int[]     PuzzleArray   = new int[] { 0, 2, 3, 1, 8, 4, 7, 6, 5 };
            int[]     Easy          = new int[] { 1, 3, 4, 8, 6, 2, 7, 0, 5 };
            int[]     Medium        = new int[] { 2, 8, 1, 0, 4, 3, 7, 6, 5 };
            int[]     Hard          = new int[] { 5, 6, 7, 4, 0, 8, 3, 2, 1 };
            int[]     GoalState     = new int[] { 1, 2, 3, 8, 0, 4, 7, 6, 5 };
            StateNode GoalStateNode = new StateNode();
            int       Time          = 0;
            int       TotalCostOfAllMoves;
            //int CostFromStart;

            int SizeOfSortedList = 0;
            int MaxOfSortedList  = 0;

            int SizeOfPQ = 0;
            int MaxOfPQ  = 0;

            PuzzleArray = Hard;

            foreach (var item in PuzzleArray)
            {
                Console.Write(item.ToString() + " ");
            }

            Console.WriteLine();
            Console.WriteLine();

            foreach (var item in PuzzleArray)
            {
                Console.Write(item.ToString() + " ");
            }
            Console.WriteLine();
            Console.WriteLine("State array");
            Console.WriteLine();

            StateNode node = new StateNode();
            StateNode root = new StateNode(PuzzleArray);

            //foreach (var item in node.StateArray)
            //{

            //    Console.Write(item.ToString() + " ");

            //}

            Console.WriteLine();
            Console.WriteLine("State array Passing PuzzleArray");
            Console.WriteLine();

            foreach (var item in root.StateArray2)
            {
                Console.Write(item.ToString() + " ");
            }

            //// Create Queue of Nodes
            //Queue<StateNode> q = new Queue<StateNode>();

            // Create Queue that will accept queue returned from Successor function
            Queue <StateNode> qFromSuccessorFunction = new Queue <StateNode>();

            //// Put original puzzle state in queue
            //q.Enqueue(root);
            //SizeOfQueue = 1;
            //MaxOfQueue = MaxOfQueue + 1;


            // Depth First Search - Create a stack
            // Stack<StateNode> stack = new Stack<StateNode>();

            // Uniform Cost Search - Need to make a Sorted List
            // Sorted based on the smallest cost from the start node of tree
            // Each move made the cost is the value of tile moved
            SortedList <int, StateNode> sortedListBasedOnCostOfMovesFromStart = new SortedList <int, StateNode>();


            PriorityQueue <StateNode> pq = new PriorityQueue <StateNode>();

            //// Put original puzzle state in Sorted List
            //sortedListBasedOnCostOfMovesFromStart.Add(root.CostOfMovesFromStart, root);
            //SizeOfSortedList = SizeOfSortedList + 1;
            //MaxOfSortedList = MaxOfSortedList + 1;

            pq.Add(root.CostOfMovesFromStart, root);
            SizeOfPQ = SizeOfPQ + 1;
            MaxOfPQ  = MaxOfPQ + 1;

            //// Put original puzzle state on stack
            //stack.Push(root);
            //SizeOfStack = SizeOfStack + 1;
            //MaxOfStack = MaxOfStack + 1;

            // Create two Dictionaries to look up previous states for state checking. Need to check if on the stack or if it was
            // previously looked at.
            Dictionary <int, int> dictOfNodesInPQ = new Dictionary <int, int>();

            Dictionary <int, int> dictOfStateArraysSeenBefore = new Dictionary <int, int>();

            dictOfNodesInPQ.Add(root.ArrayStateInt, root.ArrayStateInt);



            // Beginning of General Search Loop
            bool keepRunning = true;

            while (keepRunning)
            {
                if (pq.Count == 0)
                {
                    Console.WriteLine("sortedList empty");
                    keepRunning = false;
                }
                if (keepRunning == false)
                {
                    break;
                }


                //Remove Nodes from from of the sortedList
                StateNode removeFromPQ = new StateNode();
                //Assigns Node to first element of list
                removeFromPQ = pq.RemoveMin();
                //Then need to remove the first element(<key, value> pair) of sorted list


                Time = Time + 1;

                //// Remove nodes from top of stack for Depth-First Search
                //StateNode removeFromTopOfStack = new StateNode();
                //removeFromTopOfStack = stack.Pop();
                //Time = Time + 1;

                // Remove node from Dictionary with list of nodes currently on stack
                dictOfNodesInPQ.Remove(removeFromPQ.ArrayStateInt);
                Console.WriteLine();
                Console.WriteLine("removing this node StateArrayInt: " + removeFromPQ.ArrayStateInt);
                Console.WriteLine();

                // add this node to dictionary of nodes we have seen before if we haven't already seen it
                if (dictOfStateArraysSeenBefore.ContainsKey(removeFromPQ.ArrayStateInt))
                {
                    //do nothing
                }
                else
                {
                    dictOfStateArraysSeenBefore.Add(removeFromPQ.ArrayStateInt, removeFromPQ.ArrayStateInt);
                }



                // check if node ArrayState is Equal to the GoalState to Solve PuzzleEight
                bool isEqual = Enumerable.SequenceEqual(removeFromPQ.StateArray2, GoalState);
                if (isEqual)
                {
                    Console.WriteLine();
                    Console.WriteLine("Puzzle is Solved!");
                    GoalStateNode = removeFromPQ;
                    Console.WriteLine();
                    break;
                }


                // create a queue to accept the queue returned from successor function


                qFromSuccessorFunction = StateNode.Successor(removeFromPQ);



                //// add nodes from Successor Function into the q for the loop

                while (qFromSuccessorFunction.Count != 0)
                {
                    StateNode removeFromFrontOfSuccessorQueue = new StateNode();
                    removeFromFrontOfSuccessorQueue = qFromSuccessorFunction.Dequeue();



                    //If we have already seen this state before or this state is on the stack currently, do nothing. Otherwise put state in both dictionaries
                    if (dictOfNodesInPQ.ContainsKey(removeFromFrontOfSuccessorQueue.ArrayStateInt) || (dictOfStateArraysSeenBefore.ContainsKey(removeFromFrontOfSuccessorQueue.ArrayStateInt)))
                    {
                        // do nothing
                    }
                    else
                    {
                        pq.Add(removeFromFrontOfSuccessorQueue.CostOfMovesFromStart, removeFromFrontOfSuccessorQueue);
                        // sortedListBasedOnCostOfMovesFromStart.Add(removeFromFrontOfSuccessorQueue.CostOfMovesFromStart, removeFromFrontOfSuccessorQueue);
                        dictOfNodesInPQ.Add(removeFromFrontOfSuccessorQueue.ArrayStateInt, removeFromFrontOfSuccessorQueue.ArrayStateInt);
                        dictOfStateArraysSeenBefore.Add(removeFromFrontOfSuccessorQueue.ArrayStateInt, removeFromFrontOfSuccessorQueue.ArrayStateInt);
                    }

                    SizeOfPQ = pq.Count;
                    //SizeOfSortedList = sortedListBasedOnCostOfMovesFromStart.Count();
                    //if (MaxOfSortedList < SizeOfSortedList)
                    //{
                    //    MaxOfSortedList = SizeOfSortedList;
                    //}
                    if (MaxOfPQ < SizeOfPQ)
                    {
                        MaxOfPQ = SizeOfPQ;
                    }
                }
            }
            Console.WriteLine();
            Console.WriteLine("out of loop");
            Console.WriteLine();


            Console.WriteLine();
            Console.WriteLine("Here were the successful moves to solve the puzzle:");
            Console.WriteLine();

            StateNode.PrettyPrintPathToSolvePuzzle(GoalStateNode);

            Console.WriteLine();
            Console.WriteLine("Time = " + Time);
            Console.WriteLine();
            Console.WriteLine("MaxOfPQ " + MaxOfPQ);
            Console.WriteLine();


            Console.ReadLine();
        }
        static void Main(string[] args)
        {
            int[]     PuzzleArray   = new int[] { 1, 2, 3, 0, 8, 4, 7, 6, 5 };
            int[]     Easy          = new int[] { 1, 3, 4, 8, 6, 2, 7, 0, 5 };
            int[]     Medium        = new int[] { 2, 8, 1, 0, 4, 3, 7, 6, 5 };
            int[]     Hard          = new int[] { 5, 6, 7, 4, 0, 8, 3, 2, 1 };
            int[]     GoalState     = new int[] { 1, 2, 3, 8, 0, 4, 7, 6, 5 };
            StateNode GoalStateNode = new StateNode();
            int       Time          = 0;
            int       TotalCostOfAllMoves;
            int       MaxOfQueue  = 0;
            int       SizeOfQueue = 0;

            PuzzleArray = Hard;

            foreach (var item in PuzzleArray)
            {
                Console.Write(item.ToString() + " ");
            }

            Console.WriteLine();
            Console.WriteLine();

            foreach (var item in PuzzleArray)
            {
                Console.Write(item.ToString() + " ");
            }
            Console.WriteLine();
            Console.WriteLine("State array");
            Console.WriteLine();

            StateNode node = new StateNode();
            StateNode root = new StateNode(PuzzleArray);

            //foreach (var item in node.StateArray)
            //{

            //    Console.Write(item.ToString() + " ");

            //}

            Console.WriteLine();
            Console.WriteLine("State array Passing PuzzleArray");
            Console.WriteLine();

            foreach (var item in root.StateArray2)
            {
                Console.Write(item.ToString() + " ");
            }

            // Create Queue of Nodes
            Queue <StateNode> q = new Queue <StateNode>();

            // Create Queue that will accept queue returned from Successor function
            Queue <StateNode> qFromSuccessorFunction = new Queue <StateNode>();

            // Put original puzzle state in queue
            q.Enqueue(root);
            SizeOfQueue = 1;
            MaxOfQueue  = MaxOfQueue + 1;


            // Beginning of General Search Loop
            bool keepRunning = true;

            while (keepRunning)
            {
                if (q.Count == 0)
                {
                    Console.WriteLine("queue empty");
                    keepRunning = false;
                }
                if (keepRunning == false)
                {
                    break;
                }



                // Remove nodes from front of queue for Breadth-First Search
                StateNode removeFromFront = new StateNode();
                removeFromFront = q.Dequeue();
                Time            = Time + 1;

                // Check to see if ArrayState of node that was popped from queue matches Puzzle Solution(GoalState)


                bool isEqual = Enumerable.SequenceEqual(removeFromFront.StateArray2, GoalState);
                if (isEqual)
                {
                    Console.WriteLine();
                    Console.WriteLine("Puzzle is Solved!");
                    GoalStateNode = removeFromFront;
                    Console.WriteLine();
                    break;
                }



                // REturn the Node that matches solution


                // Call Successor Function to get the next nodes to add to list and Expand
                //Console.WriteLine();
                //Console.WriteLine("Entering Successor Function");
                //Console.WriteLine();

                // create a queue to accept the queue returned from successor function


                qFromSuccessorFunction = StateNode.Successor(removeFromFront);



                // add nodes from Successor Function into the q for the loop

                while (qFromSuccessorFunction.Count != 0)
                {
                    StateNode removeFromFrontOfSuccessorQueue = new StateNode();
                    removeFromFrontOfSuccessorQueue = qFromSuccessorFunction.Dequeue();
                    q.Enqueue(removeFromFrontOfSuccessorQueue);
                    SizeOfQueue = q.Count;
                    if (MaxOfQueue < SizeOfQueue)
                    {
                        MaxOfQueue = SizeOfQueue;
                    }
                }
            }
            Console.WriteLine();
            Console.WriteLine("out of loop");
            Console.WriteLine();


            Console.WriteLine();
            Console.WriteLine("Here were the successful moves to solve the puzzle:");
            Console.WriteLine();

            StateNode.PrettyPrintPathToSolvePuzzle(GoalStateNode);

            Console.WriteLine();
            Console.WriteLine("Time = " + Time);
            Console.WriteLine();
            Console.WriteLine("MaxOfQueue " + MaxOfQueue);
            Console.WriteLine();


            Console.ReadLine();
        }
예제 #3
0
        static void Main(string[] args)
        {
            int[]     PuzzleArray   = new int[] { 0, 2, 3, 1, 8, 4, 7, 6, 5 };
            int[]     Easy          = new int[] { 1, 3, 4, 8, 6, 2, 7, 0, 5 };
            int[]     Medium        = new int[] { 2, 8, 1, 0, 4, 3, 7, 6, 5 };
            int[]     Hard          = new int[] { 5, 6, 7, 4, 0, 8, 3, 2, 1 };
            int[]     GoalState     = new int[] { 1, 2, 3, 8, 0, 4, 7, 6, 5 };
            StateNode GoalStateNode = new StateNode();
            int       Time          = 0;
            int       TotalCostOfAllMoves;
            int       MaxOfQueue              = 0;
            int       SizeOfQueue             = 0;
            int       SizeOfStack             = 0;
            int       MaxOfStack              = 0;
            bool      IteritiveDeepeningSolve = false;

            //Max set of Levels to go Down in Iterative Deepening
            //int BigL = 0;

            for (int BigL = 0; BigL < 999999999; BigL++)
            {
                PuzzleArray = Hard;

                foreach (var item in PuzzleArray)
                {
                    Console.Write(item.ToString() + " ");
                }

                Console.WriteLine();
                Console.WriteLine();

                foreach (var item in PuzzleArray)
                {
                    Console.Write(item.ToString() + " ");
                }
                Console.WriteLine();
                Console.WriteLine("State array");
                Console.WriteLine();

                StateNode node = new StateNode();
                StateNode root = new StateNode(PuzzleArray);

                //foreach (var item in node.StateArray)
                //{

                //    Console.Write(item.ToString() + " ");

                //}

                Console.WriteLine();
                Console.WriteLine("State array Passing PuzzleArray");
                Console.WriteLine();

                foreach (var item in root.StateArray2)
                {
                    Console.Write(item.ToString() + " ");
                }

                //// Create Queue of Nodes
                //Queue<StateNode> q = new Queue<StateNode>();

                // Create Queue that will accept queue returned from Successor function
                Queue <StateNode> qFromSuccessorFunction = new Queue <StateNode>();

                //// Put original puzzle state in queue
                //q.Enqueue(root);
                //SizeOfQueue = 1;
                //MaxOfQueue = MaxOfQueue + 1;


                // Depth First Search - Create a stack
                Stack <StateNode> stack = new Stack <StateNode>();

                // Put original puzzle state on stack
                stack.Push(root);
                SizeOfStack = SizeOfStack + 1;
                MaxOfStack  = MaxOfStack + 1;

                // Create two Dictionaries to look up previous states for state checking. Need to check if on the stack or if it was
                // previously looked at.
                Dictionary <int, int> dictOfNodesOnStack = new Dictionary <int, int>();

                Dictionary <int, int> dictOfStateArraysSeenBefore = new Dictionary <int, int>();

                dictOfNodesOnStack.Add(root.ArrayStateInt, root.ArrayStateInt);



                // Beginning of General Search Loop
                bool keepRunning = true;
                while (keepRunning)
                {
                    if (stack.Count == 0)
                    {
                        Console.WriteLine("stack empty");
                        keepRunning = false;
                    }
                    if (keepRunning == false)
                    {
                        break;
                    }



                    //// Remove nodes from front of queue for Breadth-First Search
                    //StateNode removeFromFront = new StateNode();
                    //removeFromFront = q.Dequeue();
                    //Time = Time + 1;

                    // Remove nodes from top of stack for Depth-First Search
                    StateNode removeFromTopOfStack = new StateNode();
                    removeFromTopOfStack = stack.Pop();
                    Time = Time + 1;

                    // Remove node from Dictionary with list of nodes currently on stack
                    dictOfNodesOnStack.Remove(removeFromTopOfStack.ArrayStateInt);
                    Console.WriteLine();
                    Console.WriteLine("removing this node StateArrayInt: " + removeFromTopOfStack.ArrayStateInt);
                    Console.WriteLine();

                    // add this node to dictionary of nodes we have seen before if we haven't already seen it
                    if (dictOfStateArraysSeenBefore.ContainsKey(removeFromTopOfStack.ArrayStateInt))
                    {
                        //do nothing
                    }
                    else
                    {
                        dictOfStateArraysSeenBefore.Add(removeFromTopOfStack.ArrayStateInt, removeFromTopOfStack.ArrayStateInt);
                    }



                    bool isEqual = Enumerable.SequenceEqual(removeFromTopOfStack.StateArray2, GoalState);
                    if (isEqual)
                    {
                        Console.WriteLine();
                        //Console.WriteLine("Puzzle is Solved!");
                        IteritiveDeepeningSolve = true;
                        GoalStateNode           = removeFromTopOfStack;
                        Console.WriteLine();
                        break;
                    }



                    // REturn the Node that matches solution



                    // Check the level of Node in the tree. If Node level is less than BigL, call sussessor.
                    // If == to BigL, can't call successor. We reached limit.

                    if (removeFromTopOfStack.LevelDownInTree < BigL)
                    {
                        qFromSuccessorFunction = StateNode.Successor(removeFromTopOfStack);
                    }



                    //// add nodes from Successor Function into the q for the loop

                    //while (qFromSuccessorFunction.Count != 0)
                    //{
                    //    StateNode removeFromFrontOfSuccessorQueue = new StateNode();
                    //    removeFromFrontOfSuccessorQueue = qFromSuccessorFunction.Dequeue();
                    //    q.Enqueue(removeFromFrontOfSuccessorQueue);
                    //    SizeOfQueue = q.Count;
                    //    if (MaxOfQueue < SizeOfQueue)
                    //    {
                    //        MaxOfQueue = SizeOfQueue;
                    //    }
                    //}

                    //// add nodes from Successor Function into the q for the loop

                    while (qFromSuccessorFunction.Count != 0)
                    {
                        StateNode removeFromFrontOfSuccessorQueue = new StateNode();
                        removeFromFrontOfSuccessorQueue = qFromSuccessorFunction.Dequeue();



                        //If we have already seen this state before or this state is on the stack currently, do nothing. Otherwise put state in both dictionaries
                        if (dictOfNodesOnStack.ContainsKey(removeFromFrontOfSuccessorQueue.ArrayStateInt) || (dictOfStateArraysSeenBefore.ContainsKey(removeFromFrontOfSuccessorQueue.ArrayStateInt)))
                        {
                            // do nothing
                        }
                        else
                        {
                            stack.Push(removeFromFrontOfSuccessorQueue);
                            dictOfNodesOnStack.Add(removeFromFrontOfSuccessorQueue.ArrayStateInt, removeFromFrontOfSuccessorQueue.ArrayStateInt);
                            dictOfStateArraysSeenBefore.Add(removeFromFrontOfSuccessorQueue.ArrayStateInt, removeFromFrontOfSuccessorQueue.ArrayStateInt);
                        }

                        SizeOfStack = stack.Count();
                        if (MaxOfStack < SizeOfStack)
                        {
                            MaxOfStack = SizeOfStack;
                        }
                    }
                }

                if (IteritiveDeepeningSolve == true)
                {
                    Console.WriteLine();
                    Console.WriteLine("out of loop");
                    Console.WriteLine();


                    Console.WriteLine();
                    Console.WriteLine("Here were the successful moves to solve the puzzle:");
                    Console.WriteLine();

                    StateNode.PrettyPrintPathToSolvePuzzle(GoalStateNode);

                    Console.WriteLine();
                    Console.WriteLine("Time = " + Time);
                    Console.WriteLine();
                    Console.WriteLine("MaxOfStack " + MaxOfStack);
                    Console.WriteLine();


                    break;
                }


                //Console.ReadLine();
            }
            Console.WriteLine();
            Console.WriteLine("IterativeDeepening Solved at this level : " + GoalStateNode.LevelDownInTree);
            Console.WriteLine();
            Console.ReadLine();
        }