Search code examples
pythonpyevolve

How to set different parameter ranges within a real valued chromosome using Pyevolve?


I'm trying to use pyevolve to implement a real valued genetic algorithm. (Example documentation is given here: http://pyevolve.sourceforge.net/examples.html#example-2-real-numbers-gaussian-mutator)

The range of the parameters (20 in this example) can be set using setParams as follows:

# Genome instance genome = G1DList.G1DList(20) genome.setParams(rangemin=-6.0, rangemax=6.0)

However, the same range is applied to all 20. I'd like to have different ranges for the parameters. The way I tried to do it is changing the Initializators file.

The original relevant section within the file is:

    def G1DListInitializatorReal(genome, **args):
       """ Real initialization function of G1DList

        This initializator accepts the *rangemin* and *rangemax* genome parameters.

       """
       genome.clearList()

       for i in xrange(genome.listSize):
          randomReal = rand_uniform(genome.getParam("rangein", 0),
                            genome.getParam("rangemax", 100))
          genome.append(randomReal)

My modification (assuming that the first 15 have one range and the last 5 have another range) is this:

     def G1DListInitializatorReal(genome, **args):

       genome.clearList()

       for i in xrange(0,15):
          print i
          randomReal = rand_uniform(genome.getParam("rangein_1", 0),
                            genome.getParam("rangemax_1", 100))
          genome.append(randomReal)
       for j in xrange(15,20):
          print j
          randomReal2 = rand_uniform(genome.getParam("rangein_2", 0),
                            genome.getParam("rangemax_2", 100))
          genome.append(randomReal2)

I added the printing of indices i and j to make sure that I know this one is being called. I've put the modified Initializators file in the same folder as my code but when I run it, it calls the original one from elsewhere. I feel like I'm missing more changes that I need to make in pyevolve, or I'm not calling Initializators correctly, or...I don't know.

How can I successfully change the range of my chromosome parameters in pyevolve?

Thanks in advance.


Solution

  • You can use the alleles, see this example.

    Create the allele:

    alleles = GAllele.GAlleles()
    

    Create the range for each parameter:

    alleles.add(GAllele.GAlleleRange(range_min, range_max))
    

    Set the parameters:

    genome.setParams(alleles)
    

    The following code uses a list called "data" for define the ranges.

    from pyevolve import GAllele
    from pyevolve import G1DList
    from pyevolve import GSimpleGA
    from pyevolve import Crossovers
    from pyevolve import Initializators
    from pyevolve import Mutators
    from pyevolve import Scaling
    
    # data values are the [min, max] for each parameter
    data=[ [0,99], [1,10], [1,10], [90,110], [1,10],
    [1,10], [1,10], [1,10], [1,10], [1,10],
    [1,10], [5,10], [1,10], [1,10], [50,100],
    [50,100], [50,100], [50,100], [50,100], [7,77] ]
    
    def Grid_Constructor(a=data):
        alleles = GAllele.GAlleles()
        for i in range(0, 20):
            alleles.add(GAllele.GAlleleRange(a[i][0], a[i][1], real=True))
        return alleles
    
    # set the params, initializator and mutator
    genome = G1DList.G1DList(20)
    genome.setParams(allele=Grid_Constructor())
    genome.initializator.set(Initializators.G1DListInitializatorAllele)
    genome.mutator.set(Mutators.G1DListMutatorAllele)
    ga = GSimpleGA.GSimpleGA(genome)
    print(Grid_Constructor())
    #ga.evolve(freq_stats=10)
    

    The output for this code is:

    - GAlleles
        Homogeneous:     False
        List size:   20
        Alleles:
    
    Allele for 0 position:
    - GAlleleRange
        Real:        True
        Ranges Count:    1
        Range List:
                 Range from [0] to [99]
    
    Allele for 1 position:
    - GAlleleRange
        Real:        True
        Ranges Count:    1
        Range List:
                 Range from [1] to [10]
    
    Allele for 2 position:
    - GAlleleRange
        Real:        True
        Ranges Count:    1
        Range List:
                 Range from [1] to [10]
    
    .
    .
    .
    
    Allele for 19 position:
    - GAlleleRange
        Real:        True
        Ranges Count:    1
        Range List:
                 Range from [7] to [77]
    
    
    
    
    ------------------
    (program exited with code: 0)
    Press return to continue