public bool isGoalState(Object state)
        {
            NQueensBoard board = (NQueensBoard)state;

            return(board.getNumberOfQueensOnBoard() == board.getSize() &&
                   board.getNumberOfAttackingPairs() == 0);
        }
 public Object result(Object s, Action a)
 {
     if (a is QueenAction)
     {
         QueenAction  qa       = (QueenAction)a;
         NQueensBoard board    = (NQueensBoard)s;
         NQueensBoard newBoard = new NQueensBoard(board.getSize());
         newBoard.setBoard(board.getQueenPositions());
         if (qa.getName() == QueenAction.PLACE_QUEEN)
         {
             newBoard.AddQueenAt(qa.getLocation());
         }
         else if (qa.getName() == QueenAction.REMOVE_QUEEN)
         {
             newBoard.removeQueenFrom(qa.getLocation());
         }
         else if (qa.getName() == QueenAction.MOVE_QUEEN)
         {
             newBoard.moveQueenTo(qa.getLocation());
         }
         s = newBoard;
     }
     // if action is not understood or is a NoOp
     // the result will be the current state.
     return(s);
 }
        //
        // START - Interface FitnessFunction
        public double getValue(String individual)
        {
            double fitness = 0;

            NQueensBoard board     = getBoardForIndividual(individual);
            int          boardSize = board.getSize();

            // Calculate the number of non-attacking pairs of queens (refer to AIMA
            // page 117).
            List <XYLocation> qPositions = board.getQueenPositions();

            for (int fromX = 0; fromX < (boardSize - 1); fromX++)
            {
                for (int toX = fromX + 1; toX < boardSize; toX++)
                {
                    int  fromY            = qPositions.get(fromX).getYCoOrdinate();
                    bool nonAttackingPair = true;
                    // Check right beside
                    int toY = fromY;
                    if (board.queenExistsAt(new XYLocation(toX, toY)))
                    {
                        nonAttackingPair = false;
                    }
                    // Check right and above
                    toY = fromY - (toX - fromX);
                    if (toY >= 0)
                    {
                        if (board.queenExistsAt(new XYLocation(toX, toY)))
                        {
                            nonAttackingPair = false;
                        }
                    }
                    // Check right and below
                    toY = fromY + (toX - fromX);
                    if (toY < boardSize)
                    {
                        if (board.queenExistsAt(new XYLocation(toX, toY)))
                        {
                            nonAttackingPair = false;
                        }
                    }

                    if (nonAttackingPair)
                    {
                        fitness += 1.0;
                    }
                }
            }

            return(fitness);
        }
        // END - Interface GoalTest
        //

        public NQueensBoard getBoardForIndividual(String individual)
        {
            int          boardSize = individual.length();
            NQueensBoard board     = new NQueensBoard(boardSize);

            for (int i = 0; i < boardSize; i++)
            {
                int pos = Character
                          .digit(individual.charAt(i), individual.length());
                board.AddQueenAt(new XYLocation(i, pos));
            }

            return(board);
        }
            public HashSet <Action> actions(Object state)
            {
                HashSet <Action> actions = new LinkedHashSet <Action>();
                NQueensBoard     board   = (NQueensBoard)state;

                for (int i = 0; i < board.getSize(); i++)
                {
                    for (int j = 0; j < board.getSize(); j++)
                    {
                        XYLocation loc = new XYLocation(i, j);
                        if (!board.queenExistsAt(loc))
                        {
                            actions
                            .Add(new QueenAction(QueenAction.MOVE_QUEEN,
                                                 loc));
                        }
                    }
                }
                return(actions);
            }
            public HashSet <Action> actions(Object state)
            {
                NQueensBoard board = (NQueensBoard)state;

                HashSet <Action> actions = new LinkedHashSet <Action>();

                int numQueens = board.getNumberOfQueensOnBoard();
                int boardSize = board.getSize();

                for (int i = 0; i < boardSize; i++)
                {
                    XYLocation newLocation = new XYLocation(numQueens, i);
                    if (!(board.isSquareUnderAttack(newLocation)))
                    {
                        actions.Add(new QueenAction(QueenAction.PLACE_QUEEN,
                                                    newLocation));
                    }
                }

                return(actions);
            }
Exemple #7
0
        public override bool Equals(Object o)
        {
            if (this == o)
            {
                return(true);
            }
            if ((o == null) || (this.getClass() != o.getClass()))
            {
                return(false);
            }
            NQueensBoard      aBoard = (NQueensBoard)o;
            bool              retVal = true;
            List <XYLocation> locs   = getQueenPositions();

            foreach (XYLocation loc in locs)
            {
                if (!(aBoard.queenExistsAt(loc)))
                {
                    retVal = false;
                }
            }
            return(retVal);
        }
        // END - Interface GoalTest
        //

        public NQueensBoard getBoardForIndividual(String individual)
        {
            int boardSize = individual.length();
            NQueensBoard board = new NQueensBoard(boardSize);
            for (int i = 0; i < boardSize; i++)
            {
                int pos = Character
                        .digit(individual.charAt(i), individual.length());
                board.AddQueenAt(new XYLocation(i, pos));
            }

            return board;
        }
        public double h(Object state)
        {
            NQueensBoard board = (NQueensBoard)state;

            return(board.getNumberOfAttackingPairs());
        }
 public Object result(Object s, Action a)
 {
     if (a is QueenAction)
     {
         QueenAction qa = (QueenAction)a;
         NQueensBoard board = (NQueensBoard)s;
         NQueensBoard newBoard = new NQueensBoard(board.getSize());
         newBoard.setBoard(board.getQueenPositions());
         if (qa.getName() == QueenAction.PLACE_QUEEN)
             newBoard.AddQueenAt(qa.getLocation());
         else if (qa.getName() == QueenAction.REMOVE_QUEEN)
             newBoard.removeQueenFrom(qa.getLocation());
         else if (qa.getName() == QueenAction.MOVE_QUEEN)
             newBoard.moveQueenTo(qa.getLocation());
         s = newBoard;
     }
     // if action is not understood or is a NoOp
     // the result will be the current state.
     return s;
 }