如何使用Pyevolve在真值染色体内设置不同的参数范围?

时间:2016-03-28 07:36:46

标签: python pyevolve

我试图使用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中成功更改染色体参数的范围?

提前致谢。

1 个答案:

答案 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