我试图使用pyevolve来实现真正有价值的遗传算法。 (示例文档在此处给出:http://pyevolve.sourceforge.net/examples.html#example-2-real-numbers-gaussian-mutator)
可以使用setParams
设置参数范围(本例中为20),如下所示:
# Genome instance
genome = G1DList.G1DList(20)
genome.setParams(rangemin=-6.0, rangemax=6.0)
然而,相同的范围适用于所有20.我希望具有不同的参数范围。我尝试这样做的方法是更改Initializators文件。
文件中的原始相关部分是:
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)
我的修改(假设前15个有一个范围,最后5个有另一个范围)是这样的:
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和j的打印,以确保我知道这个被调用。我已将修改后的Initializators
文件放在与我的代码相同的文件夹中,但是当我运行它时,它会从其他地方调用原始文件。我觉得我错过了我需要在pyevolve中做出的更多更改,或者我没有正确地调用Initializators
,或者......我不知道。
如何在pyevolve中成功更改染色体参数的范围?
提前致谢。
答案 0 :(得分:1)
您可以使用等位基因,请参阅此example。
创建等位基因:
alleles = GAllele.GAlleles()
为每个参数创建范围:
alleles.add(GAllele.GAlleleRange(range_min, range_max))
设置参数:
genome.setParams(alleles)
以下代码使用名为" data"的列表。用于定义范围。
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)
此代码的输出为:
- 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