from GAProblem import GAProblem, Chromosome
import random

### we'll assume that the "bitstring" is really a string of '0' and '1'. Not 
### as storage-efficient as it could be.

class BitStringGAProblem(GAProblem) :

    def __init__(self, fitnessFn, strlength) :
        GAProblem.__init__(self, fitnessFn)
        self.strlength = strlength

    def makePopulation(self, popsize) :
        def getbit() :
            if random.random() < 0.5 :
                return '0'
            else :
                return '1'
        pop = []
        for i in range(popsize) :
            pop.append(BitChromosome("".join([getbit() for x in range(self.strlength)])))
        return pop

    def evalFitness(self, pop) :
        for p in pop:
            p.fitness = self.fitnessFn(p)

    def solved(self, pop) :
        return False

    def mutate(self, c) :
        def xor(s) :
            if s == '1' :
                return '0'
            else :
                return '1'
        mbit = random.randint(0,len(c.bitstring) - 1)
        c.bitstring = c.bitstring[:mbit] + xor(c.bitstring[mbit]) + c.bitstring[mbit+1:]
        
            
class BitChromosome(Chromosome) :
    def __init__(self, bitstring) :
        Chromosome.__init__(self)
        self.bitstring = bitstring

    def __repr__(self) :
        return self.bitstring
Probl
