DEAP 框架(遗传算法)模块笔记

DEAP 框架笔记


DEAP(Distributed Evolutionary Algorithms in Python)为Python框架,支持采用遗传算法或其他演化算法进行快速求解。

使用creator模块

creator模块通过对现有类赋予新的属性来进行扩展类。

例如,假设我们有一个类名为Employee。那么,使用creator工具,我们可以通过创建Developer类来扩展Employee类,代码如下:

from deap import creator
creator.create("Developer", Employee, position = "Developer",
programmingLanguages = set)

传递给create()函数的第一个变量为所设计的新类的名称。第二个变量为所需扩展的已有的类。然后,每个额外的变量定义新类的属性。如果变量是赋值类(例如,dict或set),那会在新类的constructor中初始化属性。如果变量不是一个类(例如,文字),则被加入作为类(static)属性。

因此,上述设置等同于如下代码:

class Developer(Employee):
	position = "Developer"
	def __init__(self):
		self.programmingLanguages = set()

注意:新创建的类存在于creator模块中,因此需要引用为creator.Developer。

当使用DEAP时,creator模块通常被用于创建遗传算法中的Fitness类和Individual类。

创建Fitness类

当使用DEAP时,fitness值封装在Fitness类中。DAEP可以使fitness组合几种分量(或称为objective),每个分量有自己的权重。组合这些权重定义了给定问题的fitness的行为或策略。

定义fitness策略

为了定义这种策略,DEAP有抽象类base.Fitness,其包含weights元组。为了定义策略和使该类可用,需对weights元组进行赋值。这可以通过使用creator来扩展Fitness类,类似于前面Developer类:

creator.create("FitnessMax", base.Fitness, weights=(1.0,))

这样,通过扩展base.Fitness类,得到了具有weights类属性初始值为(1.0,)的creator.FitnessMax类。

注意:当只有单个权重被定义时,weights定义中的尾部的逗号是需要的,这是因为weights是元组。

FitnessMax的这种策略是使在遗传算法中的单个目标解的fitness值最大化。相反地,如果我们有单目标问题需要使fitness值最小化来求解,我们可以使用如下创建合理地最小化策略:

creator.create("FitnessMin", base.Fitness, weights=(-1.0,))

我们也可以定义多目标优化,且每个目标地重要程度不同地策略的类:

creator.create("FitnessCompound", base.Fitness, weights=(1.0, 0.2, -0.5))

这样,我们得到了具有3个不同fitness分量的creator.FitnessCompound类。3个分量的权重分别为:1.0,0.2,-0.5.最大化第一二个分量,最小化第三个分量。其重要性的排序为:第一个、第三个和第二个。

存储fitness值

当weights元组定义了fitness策略之后,在base.Fitness类中与之相匹配的元组values,被用于包含实际fitness值。这些值由单独定义的函数来求得,一般称为evaluate()。类似于weights元组,values元组包含每个fitness分量的值。

第3个元组,wvalues,包含values元组中的每个分量于weights元组中对应分量相乘后的加权值。当一个实例定义了fitness值之后,加权值将被计算并插入到wvalues中。并且具有可以比较各自相互的大小。

一旦Fitness类创建后,我们可以在Individual类的定义中使用。

创建Individual类

creator工具的第二个常用的用途,用来定义构成遗传算法中的种群的个体。遗传算法中的个体是采用染色体表示,并能用遗传算子来操作。在DEAP中,Individual类是通过扩展表示染色体的基类来创建的。另外,DEAP中的每个个体属性中需包含fitness函数作为其中一个属性。

为了实现这两个要求,我们使用creator来创建creator.Individual类,具体如下:

creator.create("Individual", list, fitness=creator.FitnessMax)

这条代码给出了以下两种效果:

  1. 扩展Python的list类来创建Individual类,这意味着染色体使用的是list类型。
  2. Individual类的每个属性将含有fitness属性(先前创建的FitnessMax类)。

使用Toolbox类

DEAP框架提供的第二个机制为base.Toolbox类。Toolbox被用作函数(或算子)的容器,使得我们可以通过对现有函数进行别名或定制化来创建新的算子。

例如,假设我们有函数sumOfTwo(),定义如下

def sumOfTwo(a, b):
	return a + b

使用toolbox,我们可以创建新的算子,incrementByFive(),这是通过定制化了sumOfTwo()函数得到的

from deap import base
toolbox= base.Toolbox()
toolbox.register("incrementByFive", sumOfTwo, b=5)

传入到register()工具箱函数的第一个参数为新算子的名字。第二个参数为需要定制化的已有的函数。然后,每个额外的参数自动传递给定制化的函数。例如,如下的定义

toolbox.incrementByFive(10)

这等同于应用先前的函数

sumOfTwo(10, 5)

这是因为参数b已经在定义incrementByFive算子时已经固定为5.

创建遗传算子

在许多情形下,Toolbox类被用于定制化tools模块内已有的函数。tools模块包含大量有关遗传算子的函数:选择、交叉和突变,以及初始化工具。

例如,如下代码定义了3个别名后续用作遗传算子

from deap import tools
toolbox.register("select", tools.selTournament, tournsize=3)
toolbox.register("mate", tools.cxTwoPoint)
toolbox.register("mutate", tools.mutFlipBit, indpb=0.02)

这3个别名的定义细节如下:

  1. select登记为已有tools函数selTournament()的别名,其中tournsize参数设置为3.这设置了toolbox.select算子,用来实现tournament尺寸为3的tournament选择。
  2. mate登记为已有tools函数cxTwoPoint()的别名。这个定义的结果为toolbox.mate算子实现两点交叉的操作。
  3. mutate登记为已有tools函数mutFlipBit的别名,其中indpb参数设置为0.02,给出toolbox.mutate算子用来实现翻转位突变(flip bit mutation),每个需被翻转的属性的翻转概率为0.02.

tools模块提供了各自遗传算子。

选择相关函数可以在selection.py中找到,杂交相关函数在crossover.py中,突变相关函数在mutation.py中

创建种群

tools模块的init.py文件中包含几种函数,可以用于遗传算法的种群的创建和初始化。其中一个特别有用的函数为initRepeat(),其接受3个参数:

  1. 容器类型,用于放置结果对象
  2. 函数,用于生成对象,并放置于容器
  3. 对象数量

例如,下面一行代码是产生30个0-1之间的随机数的列表list:

randomList = tools.initRepeat(list, random.random, 30)

在这个例子中,list作为一种需要被填充的容器,random.random为生成函数,30为应用这个生成函数的次数,产生的值用来填充容器。

如果我们想用0或1的随机整数来填充list呢?我们可以创建一个函数使用生成单个随机数0或1

的random.radint(),然后将其置于生成函数initRepeat(),代码如下:

def zeroOrOne():
	return random.randint(0, 1)
randomList = tools.initRepeat(list, zeroOrOne, 30)

或者,我们可以利用toolbox的优势,如下:

toolbox.register("zeroOrOne", random.randint, 0, 1)
randomList = tools.initRepeat(list, toolbox.zeroOrOne, 30)

这里,我们不是显式地定义zeroOrOne()函数,而是创建zerosOrOne算子(或别名),调用具有固定参数0和1的函数random.radint()。

创建fitness

Fitness类定义确定其策略(如,最大化或最小化)的fitness权重,实际的fitness值由各自定义的函数求得。fitness计算函数一般使用toolbox模块登记为别名evaluate,代码如下:

def someFitnessCalculationFunction(individual):
	return _some_calculation_of_the_fitness
toolbox.register("evaluate",someFitnessCalculationFunction)

在这个例子中,someFitnessCalculationFunction()对每个个体计算fitness,evaluate登记为其别名。

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、软件的具体操作 1.建一个文件夹,里面必须有四个文件(Dblank;deapdeap.000;123.dta)前三个文件在一般下载的DEAP Version 2.1中都有,直接复制过来就可以,第四个文件是一个数据文件,一般先在excel中先输入,再复制到一个记事本下就可以,注意在记事本下的数据只有数据,不包括决策单元的名称和投入、产出的名称,并且一定要先放产出,后是投入。例子具体见123电子表格和123记事本。 2.对命令Dblank文件进行修改,修改后保存为123.ins文件 3.打开deap软件,运行123.ins 4,回车后自动会有123.out 注意事项:(1) 123.dta;Dblank;123.ins都用记事本打开; (2)数据文件名和命令文件名一定要一样,如例子中都用123 (3)文件夹中一定要包括deap.000文件,如果没有这个文件,打开deap软件,就会出现一闪就没有了的情况。 二,结果的分析 在文件夹中打开123.out,看如下: 1) firm crste vrste scale 1 0.687 1.000 0.687 drs 2 0.814 1.000 0.814 drs 3 0.319 0.709 0.450 drs 4 1.000 1.000 1.000 - 5 1.000 1.000 1.000 - 6 0.336 0.425 0.791 drs 7 0.642 0.648 0.991 irs 8 0.379 0.381 0.994 irs 9 0.702 0.750 0.936 irs 10 1.000 1.000 1.000 - 11 0.304 0.461 0.659 irs 12 0.352 1.000 0.352 irs 13 1.000 1.000 1.000 - 14 0.594 0.929 0.639 irs 15 0.402 1.000 0.402 irs mean 0.635 0.820 0.781 firm:代表例子中的15的样本 crste:技术效率,也叫综合效率 vrste:纯技术效率 scale:规模效率(drs:规模报酬递减;-:规模报酬不变;irs:规模报酬递增) crste=vrste×scale 2) Results for firm: 3 Technical efficiency = 0.709 Scale efficiency = 0.450 (drs) PROJECTION SUMMARY: variable original radial slack projected value movement movement value output 1 7326.380 0.000 0.000 7326.380 output 2 119.910 0.000 0.000 119.910 input 1 15427.000 -4496.010 0.000 10930.990 input 2 5257.970 -1532.371 -1643.828 2081.771 第三个样本的具体分析如下: 纯技术效率=0.709 规模效率=0.450 (drs):规模报酬应该递减 第三个样本的投入产出情况分析: 第一、二产出均没有冗余情况(因为其 radial movement 和 slack movement 均为零) 第一个投入要素有投入冗余4496.010;第二投入要素有投入冗余3176.199=1532.371+1643.828 这个意思是说按第三个样本现在的产出冗余第一个投入要素可以减少4496.010,第二个投入要素可以减少3176.199 Results for firm: 8 Technical efficiency = 0.381 Scale efficiency = 0.994 (irs) PROJECTION SUMMARY: variable original radial slack projected value movement movement value output 1 235.860 0.000 0.000 235.860 output 2 3.760 0.000 6.995 10.755 input 1 777.000 -480.651 0.000 296.349 input 2 132.550 -81.995 0.000 50.555 第八个样本则出现了产出不足的情况,即第二个产出应该比现在增加 6.995 如果投入因素是决策单元可的决定的,而产出因素是不能决定的时,我们分析就可以考虑投入是否能减少,不管产出是否能增加(因为产出是决策单元不可控的因素) 如果产出因素是决策单元可的决定的,而投入因素是不能决定的时,我们分析就可以考虑产出是否能增加,不管投入是否能减少(因为投入是决策单元不可控的因素) 如果样本单元的纯技术效率为1,而规模效率小于1时,这说明样本单元本身的技术效率而言没有投入需要减少、没有产出需要增加;样本单元的综合效率没有达到有效(即1),是因为其规模和投入、产出不相匹配,需要增加规模或减少规模。如例子中的第二个样本单元,其规模应该缩小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值