Question

In: Computer Science

Python Code for 8-queens using random restart algorithms

Python Code for 8-queens using random restart algorithms

Solutions

Expert Solution

Code:

#!/usr/bin/python

import random,sys,copy

from optparse import OptionParser

try:

import psyco

psyco.full()

except ImportError:

pass

"""

cowboy code, but seems to work

USAGE: python prog <numberruns=1> <verbocity=False>

"""

class board:

def __init__(self, list=None):

    if list == None:

      self.board = [[0 for i in range(0,8)] for j in range(0,8)]

      #initialize queens at random places

      for i in range(0,8):

        while 1:

          rand_row = random.randint(0,7)

          rand_col = random.randint(0,7)

          if self.board[rand_row][rand_col] == 0:

            self.board[rand_row][rand_col] = "Q"

            break

    #TODO raise errors if board is not right format or dimension

#define how to print the board

def __repr__(self):

    mstr = ""

    for i in range(0,8):

      for j in range(0,8):

        mstr = mstr + str(self.board[i][j]) + " "

      mstr = mstr + "n"

    return (mstr)

class queens:

def __init__(self, numruns, verbocity, passedboard=None):

    #TODO check options

    self.totalruns = numruns

    self.totalsucc = 0

    self.totalnumsteps = 0

    self.verbocity = verbocity

    for i in range(0,numruns):

      if self.verbocity == True:

        print "===================="

        print "BOARD",i

        print "===================="

      self.mboard = board(passedboard)

      self.cost = self.calc_cost(self.mboard)

      self.hill_solution()

def hill_solution(self):

    while 1:

      currViolations = self.cost

      self.getlowercostboard()

      if currViolations == self.cost:

        break

      self.totalnumsteps += 1

      if self.verbocity == True:

        print "Board Violations", self.calc_cost(self.mboard)

        print self.mboard

    if self.cost != 0:

      if self.verbocity == True:

        print "NO SOLUTION FOUND"

    else:

      if self.verbocity == True:

        print "SOLUTION FOUND"

      self.totalsucc += 1

    return self.cost

def printstats(self):

    print "Total Runs: ", self.totalruns

    print "Total Success: ", self.totalsucc

    print "Success Percentage: ", float(self.totalsucc)/float(self.totalruns)

    print "Average number of steps: ", float(self.totalnumsteps)/float(self.totalruns)

def calc_cost(self, tboard):

    #these are separate for easier debugging

    totalhcost = 0

    totaldcost = 0

    for i in range(0,8):

      for j in range(0,8):

        #if this node is a queen, calculate all violations

        if tboard.board[i][j] == "Q":

          #subtract 2 so don't count self

          #sideways and vertical

          totalhcost -= 2

          for k in range(0,8):

            if tboard.board[i][k] == "Q":

              totalhcost += 1

            if tboard.board[k][j] == "Q":

              totalhcost += 1

          #calculate diagonal violations

          k, l = i+1, j+1

          while k < 8 and l < 8:

            if tboard.board[k][l] == "Q":

              totaldcost += 1

            k +=1

            l +=1

          k, l = i+1, j-1

        while k < 8 and l >= 0:

            if tboard.board[k][l] == "Q":

              totaldcost += 1

            k +=1

            l -=1

          k, l = i-1, j+1

          while k >= 0 and l < 8:

            if tboard.board[k][l] == "Q":

              totaldcost += 1

            k -=1

            l +=1

          k, l = i-1, j-1

          while k >= 0 and l >= 0:

            if tboard.board[k][l] == "Q":

              totaldcost += 1

            k -=1

            l -=1

    return ((totaldcost + totalhcost)/2)

#this function tries moving every queen to every spot, with only one move

#and returns the move that has the leas number of violations

def getlowercostboard(self):

    lowcost = self.calc_cost(self.mboard)

    lowestavailable = self.mboard

    #move one queen at a time, the optimal single move by brute force

    for q_row in range(0,8):

      for q_col in range(0,8):

        if self.mboard.board[q_row][q_col] == "Q":

          #get the lowest cost by moving this queen

          for m_row in range(0,8):

            for m_col in range(0,8):

              if self.mboard.board[m_row][m_col] != "Q":

                #try placing the queen here and see if it's any better

                tryboard = copy.deepcopy(self.mboard)

                tryboard.board[q_row][q_col] = 0

                tryboard.board[m_row][m_col] = "Q"

                thiscost = self.calc_cost(tryboard)

                if thiscost < lowcost:

                  lowcost = thiscost

                  lowestavailable = tryboard

    self.mboard = lowestavailable

    self.cost = lowcost

if __name__ == "__main__":

parser = OptionParser()

parser.add_option("-q", "--quiet", dest="verbose",

                   action="store_false", default=True,

                   help="Don't print all the moves... wise option if using large numbers")

parser.add_option("--numrun", dest="numrun", help="Number of random Boards", default=1,

                   type="int")

(options, args) = parser.parse_args()

mboard = queens(verbocity=options.verbose, numruns=options.numrun)

mboard.printstats()


Related Solutions

Write a python script to solve the 4-queens problem using. The code should allow for random...
Write a python script to solve the 4-queens problem using. The code should allow for random starting, and for placed starting. "The 4-Queens Problem[1] consists in placing four queens on a 4 x 4 chessboard so that no two queens can capture each other. That is, no two queens are allowed to be placed on the same row, the same column or the same diagonal." Display the iterations until the final solution Hill Climbing (your choice of variant)
Write and Compile a python script to solve the 4-queens problem using. The code should allow...
Write and Compile a python script to solve the 4-queens problem using. The code should allow for random starting, and for placed starting using numpy "The 4-Queens Problem[1] consists in placing four queens on a 4 x 4 chessboard so that no two queens can capture each other. That is, no two queens are allowed to be placed on the same row, the same column or the same diagonal." Display the iterations until the final solution Arc consistency
Write a python code using a continuous random variable and using uniform distribution to output the...
Write a python code using a continuous random variable and using uniform distribution to output the expected weight of students in a class.
Write and Compile a python script to solve the 4-queens problem using Forward Checking algorithm ....
Write and Compile a python script to solve the 4-queens problem using Forward Checking algorithm . The code should allow for random starting, and for placed starting. Random Starting means randomly place a queen position on the chessboard. Placed Starting means asked for the user input to place a queen position on the chessboard. Display the iterations until the final solution "The 4-Queens Problem[1] consists in placing four queens on a 4 x 4 chessboard so that no two queens...
In this case study, your task is to study different search algorithms to solve the N-Queens...
In this case study, your task is to study different search algorithms to solve the N-Queens Problem which has been presented in class. We will focus on the incremental formulation in which we add a queen to any square in the leftmost empty column that is not attacked by any other queen. We will compare the following algorithms: 1- Breadth-first Seatch (BFS) 2- Depth-first Search (DFS) 3- Simulated Annealing (SA) 4- Hill Climbing (HC) Question is:. Using any of the...
In this case study, your task is to study different search algorithms to solve the N-Queens...
In this case study, your task is to study different search algorithms to solve the N-Queens Problem which has been presented in class. We will focus on the incremental formulation in which we add a queen to any square in the leftmost empty column that is not attacked by any other queen. Question: Using Depth-first Search (DFS) algorithms, how many steps are needed to find the solution for the 8-Queens Problem? What is it? Draw on an 8x8 table. Show...
In this case study, your task is to study different search algorithms to solve the N-Queens...
In this case study, your task is to study different search algorithms to solve the N-Queens Problem which has been presented in class. We will focus on the incremental formulation in which we add a queen to any square in the leftmost empty column that is not attacked by any other queen. Question: Does Simulated Annealing (SA) algorithms (with 10 iterations) solve the 14-Queens Problem? What about Simulated Annealing (SA) algorithms (with 50 iterations). Show your answer.
In this case study, your task is to study different search algorithms to solve the N-Queens...
In this case study, your task is to study different search algorithms to solve the N-Queens Problem which has been presented in class. We will focus on the incremental formulation in which we add a queen to any square in the leftmost empty column that is not attacked by any other queen. Question: Using Hill Climbing (HC) algorithms, how many steps are needed to find the solution for the 12-Queens Problem? What is it? Draw on an 12x12 table. Show...
I am trying to create an 8-bit random number generator in verilog code using a mux,...
I am trying to create an 8-bit random number generator in verilog code using a mux, a d flip flop and a LFSR not sure what I am doing wrong but need some help with getting it working properly any help would be greatly appreciated. here is what I have so far: module RNG #(parameter size=8)(output [7:0]SO,output [7:0] RN,input clk,rst,input[size-1:0]seed,input L);    wire [7:0] Sin=SO[7]^SO[5]^SO[4]^SO[3];    ffw F1 (SO,clk,rst,Sin);    MUX M1 (Sin,seed,{SO[size-2:0],next},L);    xor X1 (next,SO[6],SO[7]);    assign RN=next;...
need a code MIPS assembly language program to implement algorithms of an 8-bit integer "positive integer"...
need a code MIPS assembly language program to implement algorithms of an 8-bit integer "positive integer" to calculate the square root for an-8 bit integer using The Radix-2 SRT-Redundant and Non-Redundant Algorithm to approximate square root
ADVERTISEMENT
ADVERTISEMENT
ADVERTISEMENT