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.
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