The N-queens problem is to place N queens on an N-by-N chess board so that none are in the same row, the same column, or the same diagonal. For example, if N=4, this is a solution:
The goal of this assignment is to solve the N-queens problem using simulated annealing.
Here is the simulated annealing algorithm:
simulated-annealing(initial solution) let solution be initial let t be an initial temperature until t is almost zero let neighbor be a random neighbor of solution if the cost of neighbor is less than the cost of solution let solution be neighbor stop if the cost is now 0 otherwise let c be the cost increase compute p = e^(-c/t) with probability p, let solution be neighbor multiply t by a decay rate return solution
A Board class and an Agent class have been started for you below. Once you complete the indicated methods, you will be able to watch a random initial solution being annealed. Adjust the height of your console window to match the board height, so that each display appears in the same place.
Algorithm notes:
Parameter notes:
import time import random class Board(object): """An N-queens solution attempt.""" def __init__(self, queens): """Instances differ by their queen placements.""" self.queens = queens.copy() # No aliasing! def display(self): """Print the board.""" for r in range(len(self.queens)): for c in range(len(self.queens)): if self.queens[c] == r: print 'Q', else: print '-', print print def moves(self): """Return a list of possible moves given the current placements.""" # YOU FILL THIS IN def neighbor(self, move): """Return a Board instance like this one but with one move made.""" # YOU FILL THIS IN def cost(self): """Compute the cost of this solution.""" # YOU FILL THIS IN class Agent(object): """Knows how to solve an n-queens problem with simulated annealing.""" def anneal(self, board): """Return a list of moves to adjust queen placements.""" # YOU FILL THIS IN def main(): """Create a problem, solve it with simulated anealing, and console-animate.""" queens = dict() for col in range(8): row = random.choice(range(8)) queens[col] = row board = Board(queens) board.display() agent = Agent() path = agent.anneal(board) while path: move = path.pop(0) board = board.neighbor(move) time.sleep(0.1) board.display() if __name__ == '__main__': main()