GA-assignment 02
GA-assignment 02
20204170
CSE-C
(a).Describe the approach to solving the N-queen problem using a genetic algorithm. Explain
the solution methodically, illustrating key steps with a practical example.
First of all N-Queen problem is the problem where we need to find an arrangement of N queens on the
chessboard, such that no queen can attack any other queens on the board. So in our 5-Queens problem
we need to placing 5 chess queens on a 5×5 chessboard so that no two queens attack each other. In
order to solve the 5-Queen problem the following steps are needed:
1) Chromosome design
2) Initialization
3) Fitness evaluation
4) Selection
5) Crossover
6) Mutation
7) Update generation
8) Go back to 3)
Chromosome Design
2) Initialization
[5 2 4 3 5]
[4 3 5 1 4]
[2 1 3 2 4]
[5 2 3 4 1]
3) Fitness evaluation
First of all, the fitness function is pairs of non-attacking queens. So, higher scores are better is better for
us. In order to solve the fitness function for the chromosome [5 2 4 3 5], I assigned each queen uniquely
as Q1, Q2, Q3, Q4 and Q5. And to find the fitness function value.
4) Selection
In the next step, we randomly choose the two pairs to reproduce based on probabilities which we
counted on the previous step. In other words, a certain number of chromosomes will survive into the
next generator using a selection operator. Here selected chromosomes to act as parents that are
combined using crossover operator to make children. In addition to this, we pick a crossover point per
pair.
5) Crossover
In the crossover, selected chromosomes act as parents that are combined using crossover operator to
make children. In other words, it combines the genetic information of two parents to generate new
offspring.
6) Mutation
The next step is mutation. In the mutation process, we alter one or more gene values in chromosomes
which we found after crossover. So it randomly changes a few gens and the mutation probability is low.
7) Update generation
In the next step, we need to update the generation. New chromosomes will update the population but
the population number will not change
Step 4: Reproduce (crossover) new chromosome from 2 randomly selected best chromosomes
Repeat Step 2 to 6 until a chromosome (solution) with Fitness value = Fmax is found
c). Choose a programming language and implement the solution. Attach the code and
screenshots of the output.
import random
def fitness(chromosome):
diagonal_collisions = 0
n = len(chromosome)
left_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
r = random.uniform(0, total)
upto = 0
if upto + w >= r:
return c
upto += w
assert False, "Shouldn't get here"
n = len(x)
c = random.randint(0, n - 1)
n = len(x)
c = random.randint(0, n - 1)
m = random.randint(1, n)
x[c] = m
return x
mutation_probability = 0.03
new_population = []
for i in range(len(population)):
child = reproduce(x, y) #creating two new chromosomes from the best 2 chromosomes
child = mutate(child)
print_chromosome(child)
new_population.append(child)
return new_population
def print_chromosome(chrom):
.format(str(chrom), fitness(chrom)))
generation = 1
print("")
generation += 1
chrom_out = []
if fitness(chrom) == maxFitness:
print("")
chrom_out = chrom
print_chromosome(chrom)
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):
print()
print_board(board)