R语言GA包的简介及相关代码示例
GA包是为了在R语言的环境中实现基于遗传算法分析的工具,包GA提供了相当丰富内部函数供用户使用。GA包的主程序叫做 ga,包含了下列主要参数:
ga(type = c(\"binary\ fitness, ..., min, max, nBits,
population = gaControl(type)@population, selection = gaControl(type)@selection, crossover = gaControl(type)@crossover, mutation = gaControl(type)@mutation, popSize = 50, pcrossover = 0.8, pmutation = 0.1, elitism = max(1, round(popSize * 0.05)), monitor = gaMonitor, maxiter = 100, run = maxiter, maxfitness = -Inf, names = NULL, suggestions, seed) 其中,有效参数是:
type:决定遗传算法分析的决策变量的类型,可能的值为:”binary”表示决策变量为二进制型;”real-valued”表示决策变量为实数型,即决策变量为浮点型实数;”premutation”表示涉及到一个列表排序的问题的变量。
fitness:表示适应性函数,任何一个可行的R的函数,只要它有着
的函数名,都可以代表一个可行解,而且会返回一个描述适应度的数值。
min,max:表示决策变量上下限的向量,在实数类型中,它代表着遗传算法搜索空间的范围。
nBits:表示二进制编码的位数的值。 population:用于随机产生初始种群的R函数
selection:用于模拟自然选择过程的R函数,根据每一个个体的适应度从当前世代中挑选产生新的世代。
pcrossover:表示交叉概率的值,默认概率为0.8 pmutation: 表示变异概率的值,默认概率为0.1 popSize:表示种群大小的量。
elitism:表示在每一次种群更迭中最适应的个体存活下来的比例,默认设定为5%的个体会在更迭中存话而形成新的世代。
monitor:将当前ga对象的状态作为输入值的函数,并显示搜索结果的进化过程。在默认状态下,函数gaMonitor会将每一次更迭结果的平均值与最适值显示出来。
maxiter:表示最大迭代数。
run:表示连续出现一定数目的未改善世代后,GA搜索终止。 maxfitness:表示适应值的上限,满足后GA搜索终止。 names:表示决策变量名的向量。
suggestions:表示结果名称的字符串矩阵。
seed:包含随机数生成器状态的整数向量。这个参数可以用来复
制一个遗传算法搜索的结果。
ga程序至少有type和fitness这两个参数。对于二进制搜索,则必须有nBits参数;对于实数类型的决策变量,则必须有min和max这两个参数。
执行ga程序后,会返回一系列描述对象状态与结果的值,包括: iter:表示当前进行搜索的循环数。 fitness:评价当前种群的适应度
best:在每次GA搜索的循环中最大适应度值。 mean:在每次GA搜索循环中平均适应度至。 fitnessValue:GA搜索结束后最大的适应度值。
solution:表示最终结果的矩阵,其行数为找到的最优解个数,列数为决策变量的个数。
要在R中调用GA包,首先要进行安装,输入以下代码: > install.packages(\"GA\")
安装完成后调用GA包,输入以下代码: > library(GA)
调用完成后便可以使用GA包中的内置函数,以下是GA包在人口增长预测分析的实际应用,数据为非真实数据。
以下为XX市1993-2007年人口数据(表一):
年份 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007
表一
单位:万人 人口数 67.52 68.01 68.50 68.99 69.49 69.99 70.49 71.00 71.51 72.02 72.54 73.06 73.59 74.12 73.65 利用遗传算法对该市2010,2020,2030年人口数进行预测,程序代码如下所示:
> library(GA) > t<-c(1993:2007)
>populationN<-c(67.52,68.01,68.50,68.99,69.49,69.99,70.49,71.00,71.51,72.02,72.54,73.06,73.59,74.12,73.65)
> functionP<-function(x,theta) + 67.52*(1+theta)^(x-1993)
> fitness1<-function(x,y,theta)-sum((y-functionP(x,theta))^2) > GA1<-ga(type=\"real-valued\+ x=t,y=populationN,min=0,max=1,
+ popSize=500,crossover=gareal_blxCrossover,maxiter=5000, + run=200,names= c(\"rate\")) 本程序基于人口自然增长公式,即:
P(t)=P(t0)(1+r)t-t0 式—1
式中:P(t)为规划年人口数;P(t0)为基期年人口数;r为人口年增长率。
程序运行后将显示搜索结果:
Iter = 1 | Mean = -104757579133 | Best = -1.322362 ......
Iter = 346 | Mean = -23958247384 | Best = -0.80307 输入 summary(GA1)将对结果进行分析并显示,从而得到最终的人口自然增长率:
+-----------------------------------+ | Genetic Algorithm |
+-----------------------------------+
GA settings:
Type = real-valued Population size = 500 Number of generations = 5000 Elitism = 25 Crossover probability = 0.8 Mutation probability = 0.1 Search domain rate Min 0 Max 1
GA results:
Iterations = 346 Fitness function value = -0.80307 Solution = rate [1,] 0.007004309
其中0.007004309便是我们此次所求公式中的r即人口自然增长率。
这之后输入代码:
> functionM<-function(x,theta) + 67.52*exp(theta*(x-1993))
> fitness2<-function(x,y,theta)-sum((y-functionM(x,theta))^2) > GA2<- ga(type=\"real-valued\+ x=t,y=populationN,min=0,max=1,
+ popSize=500,crossover=gareal_blxCrossover,maxiter=5000, + run=200,names= c(\"rate2\")) 此代码基于马尔萨斯人口模型即:
p(t)=p(t0)er(t-t0) 式—2
式中:p(t)是t年预测人口数;p(t0)是基期年人口数;r是人口年增长率。
输入summary(GA2)将显示以下结果:
+-----------------------------------+ | Genetic Algorithm |
+-----------------------------------+
GA settings:
Type = real-valued Population size = 500 Number of generations = 5000 Elitism = 25
Crossover probability = 0.8 Mutation probability = 0.1 Search domain rate2 Min 0 Max 1
GA results:
Iterations = 322 Fitness function value = -0.80307 Solution = rate2 [1,] 0.0069798
即得以此公式计算所需的人口增长率,为0.0069798. 为提高预测准确率,现将式—1和式—2加权求和,得式—3
P(t)=w1(p(t0)(1+0.007004309)(t-t0))+w2(p(t0)e0.0069798(t-t0)) 式—3.
式中w1和w2为这两个公式的权重,现利用遗传算法确定各权重值,代码如下:
> function3<-function(x,theta)
+theta[1]*(67.52*(1+0.007004309)^(x-1993))+theta[2]*(67.52*exp(0.0069798*(x-1993)))
> fitness3<-function(theta,x,y)-sum((y-function3(x,theta))^2) > GA3<-ga(type=\"real-valued\+ x=t,y=populationN,min=c(0,0),max=c(1,1),
+ popSize=500,crossover=gareal_blxCrossover,maxiter=5000, + run=200,names= c(\"w1\> summary(GA3)
运行之后得到以下结果:
+-----------------------------------+ | Genetic Algorithm |
+-----------------------------------+
GA settings:
Type = real-valued Population size = 500 Number of generations = 5000 Elitism = 25 Crossover probability = 0.8 Mutation probability = 0.1 Search domain
w1 w2 Min 0 0 Max 1 1
GA results:
Iterations = 350 Fitness function value = -0.77562 Solution = w1 w2 [1,] 0.5955365 0.40475 即可得到式—4:
P(t)=0.5955365(p(t0)(1+0.007004309)(t-t0))+0.40475(p(t0)e0.0069798(t-t0)) 式—4
基于此公式,便可以预测该市2010,2020及2030年的人口数。