Professional Documents
Culture Documents
GENETIC ALGORITHM
CODE:
import random
def fitness(chromosome):
horizontal_collisions = sum([chromosome.count(queen)-1 for queen in chromosome])/2
diagonal_collisions = 0
n = len(chromosome)
left_diagonal = [0] * 2*n
right_diagonal = [0] * 2*n
for i in range(n):
left_diagonal[i + chromosome[i] - 1] += 1
right_diagonal[len(chromosome) - i + chromosome[i] - 2] += 1
diagonal_collisions = 0
for i in range(2*n-1):
counter = 0
if left_diagonal[i] > 1:
counter += left_diagonal[i]-1
if right_diagonal[i] > 1:
counter += right_diagonal[i]-1
diagonal_collisions += counter / (n-abs(i-n+1))
if __name__ == "__main__":
nq = int(input("Enter Number of Queens: ")) #say N = 8
maxFitness = (nq*(nq-1))/2 # 8*7/2 = 28
population = [random_chromosome(nq) for _ in range(100)]
generation = 1
board = []
for x in range(nq):
board.append(["x"] * nq)
for i in range(nq):
board[nq-chrom_out[i]][i]="Q"
def print_board(board):
for row in board:
print (" ".join(row))
print()
print_board(board)
localhost:8888/nbconvert/html/Untitled2.ipynb?download=false 2/5
localhost:8888/nbconvert/html/Untitled2.ipynb?download=false 3/5
HILL CLIMBING
localhost:8888/nbconvert/html/Untitled2.ipynb?download=false 4/5
In [2]: import random
import math
import numpy as np
# backward fixing
for i in reversed(range(N)):
check = False
for j in range(N):
if board[j][i] == 1 and check and i != 0:
board[j][i] = 0
for k in range(N):
if board[k][i - 1] == 0:
board[k][i - 1] = 1
break
if board[j][i] == 1 and not check:
check = True
# function to calculate objective i.e. how many queens are attacking each othe
r
def objectiveFunc(temp_board):
count = 0
localhost:8888/nbconvert/html/Untitled2.ipynb?download=false 5/5
for i in range(N):
for j in range(N):
if temp_board[i][j] == 1:
# checking other queens in the same row
col = 0
while col != N:
if col != j and temp_board[i][col] == 1:
count += 1
col += 1
localhost:8888/nbconvert/html/Untitled2.ipynb?download=false 6/5
def checkNeighboursHC(row, col):
global board
temp_board = np.copy(board)
localhost:8888/nbconvert/html/Untitled2.ipynb?download=false 7/5
for j in range(N):
if count == 0:
return not None
if board[i][j] == 1:
count = checkNeighboursHC(i, j)
if np.array_equal(check, board): # if no better neighbours were found
then return
return None
if hillClimbing() is None:
print("\nNo solution found using Hill Climbing.\n")
else:
print("\nFinal board using Hill Climbing:\n", board)
Enter N: 8
Initial Board:
[[0 0 1 0 0 0 0 0]
[1 0 0 0 0 0 0 0]
[0 0 0 0 0 0 1 1]
[0 1 0 0 0 1 0 0]
[0 0 0 1 1 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]]
In [ ]:
localhost:8888/nbconvert/html/Untitled2.ipynb?download=false 8/5