UserPreferences

GASixteenQueensProgram


You are not allowed to edit this page. Are you logged in? Click on UserPreferences in upper-righthand corner.

Clear message

  1 
  2 
  3 
  4 
  5 
  6 
  7 
  8 
  9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
 27 
 28 
 29 
 30 
 31 
 32 
 33 
 34 
 35 
 36 
 37 
 38 
 39 
 40 
 41 
 42 
 43 
 44 
 45 
 46 
 47 
 48 
 49 
 50 
 51 
 52 

from pyrobot.brain.ga import *

def safe_queen(new_row, new_col, sol):
    for row in range(new_row):
        if (sol[row] == new_col or
            sol[row] + row == new_col + new_row or
            sol[row] - row == new_col - new_row):
            return 0
    return 1

def fitness(sol):
    set = []
    row = 0
    sum = 0
    for col in sol:
        set.append( col )
        if col < 0 or col >= len(sol):
            return 0
        sum += safe_queen( row, col, set)
        row += 1
    return sum

class GAQueens(GA):
    def fitnessFunction(self, genePos):
        return fitness(self.pop.individuals[genePos].genotype)

    def isDone(self):
        best = fitness(self.pop.bestMember.genotype)
        print "Safe queens", best
        return  best == len(self.pop.bestMember.genotype)

    def mutate(self, **args):
        pos = int(random.random() * len(self.genotype))
        self.genotype[pos] =  math.floor(random.random() * \
                                   (self.max - self.min + 1)) + self.min

class MyGene(Gene):
    def display(self):
        for row in range(len(self.genotype)):
            for col in self.genotype:
               if col == row:
                    print "X",
               else:
                    print ".",
            print ""
        print ""

ga = GAQueens(Population(300, MyGene, size = 16, mode = 'integer', max = 16, elitePercent = .1),
              maxGenerations = 200, verbose = 1)
ga.evolve()
ga.pop.bestMember.display()