R语言遗传算法

来源:互联网 发布:成都房地产大数据分析 编辑:程序博客网 时间:2024/05/29 05:05

R语言中有程序包实现了遗传算法,通常使用mcga\genalg\rgenoud

mcga包

mcga主要包括两个函数,mcga与multi_mcga,其中mcga适用于单目标函数最小化问题
而multi_mcga可以使用mcga一样的逻辑实现多目标化的优化
计算f(x) = x&sin(x)

library(GA)library(foreach)library(mcga)getAdjust <- function(x){  if(x>=0 && x<=12.55)  {    return(-(x*sin(x)))  }else{    return(exp(100))    }}m = mcga(popsize = 20,chsize = 1,minval = 0,maxval = 12.55,maxiter = 1000,evalFunc = getAdjust)str(m)                                                         #List of 10#$ population: num [1:20, 1] 7.96 7.96 7.96 7.96 7.96 ...#$ costs     : num [1:20] -7.91 -7.91 -7.91 -7.91 -7.91 ...#$ popsize   : num 20#$ chsize    : num 1#$ crossprob : num 1#$ mutateprob: num 0.01#$elitism   : num 1#$ minval    : num 0#$ maxval    : num 12.6#$ maxiter   : num 1000#从population可知,我们求得的最优解为7.98,需要注意的是,在计算适应度的函数中,需要限制参数#的范围,由于评估函数的是针对最小化问题的,所以要求最大值,需要加个负号
模型参数介绍
#mcga(popsize, chsize, crossprob = 1.0, mutateprob = 0.01, #     elitism = 1, minval, maxval, maxiter = 10, evalFunc)#popsize     种群规模#chsize   参数数量#crossprob    交叉概率,默认为1.0#mutateprob   变异概率,默认为0.01#elitism      直接复制到子代的最佳个体数目,默认为1个#minval     随机生成种群的下边界值#maxval     随机生成种群的上边界值#maxiter      最大世代次数,即繁殖次数,默认为10#evalFunc     一个R函数,用来计算个体适应度,每一个问题都默认是最少化问题

genalg包

genalg包是基于R语言用于二元和浮点染色体的遗传算法,它主要包括了两个函数 rbga.bin与rbga

rbga.bin实现了基于二元染色体的遗传算法,可用于特征选择,其结果最优时对应的染色体的评估结果是最小的
rbga实现了基于浮点染色体的遗传算法,采用待优化的浮点值的最大最小值作为输入,对应最佳染色体的评估结果是最小的
它们的实现过程,都需要自定义评估函数evalFunc,rbga.bin的函数evalFunc以二元染色体为参数,而在rbga函数中,需要一个浮点向量作为参数,它们都可以通过设置monitorFunc对遗传算法的实现过程进行监控,monitorFunc需要rbga对象作为参数
与mcga包不同,genalg包中的rbga对象,可以调用plot函数进行进行可视化,展现遗传算法运行过程中的特征,默认显示最小值和平均的评估值,指示遗传算法执行的进度。直方图用于呈现二元染色体基因的选择频率,即一个基因在当前种群被选择的次数如果是浮点染色体,它将为每个变量绘制直方图来说明当前种群中被选择的值。
参数图用于呈现评估函数与变量值,这对查看变量与评估值之间的相关关系是很有用

library(genalg)#定义适应度函数getAdjust <- function(x){  if(x>=0 && x<=12.55)  {    return(-(x*sin(x)))  }else{    return(exp(100))  }}#定义监控函数monitor = function(rbga0){  #打印种群中的第一个个体的值population[1,]  print(rbga0$population[1,])}rbgaObj = rbga(stringMin = c(0),stringMax = c(12.55),popSize = 50,iters = 1000,               mutationChance = 0.01,monitorFunc = monitor,evalFunc = getAdjust,verbose = TRUE)str(rbgaObj)#List of 12#$ type          : chr "floats chromosome"#$ stringMin     : num 0#$ stringMax     : num 12.6#$ popSize       : num 50#$ iters         : num 1000#$ suggestions   : NULL#$ population    : num [1:50, 1] 7.98 7.98 7.98 7.98 7.98 ...#$ elitism       : num 10#$ mutationChance: num 0.01#$ evaluations   : num [1:50] -7.92 -7.92 -7.92 -7.92 -7.92 ...#$ best          : num [1:1000] -7.92 -7.92 -7.92 -7.92 -7.92 ...#$ mean          : num [1:1000] 1.291 -0.251 -1.625 -2.506 -3.273 ...#- attr(*, "class")= chr "rbga"#从population可知,我们求得的最优解为7.98,这与我们上文捉到的最优解相同,对rbgaObj调用,可知,迭代次数的增加。#评估先是骤降,经过一段不稳定的变化之后,在1000次附近趋于稳定。plot(rbgaObj)#当设置参数type = "hist"时,可得直方图,如图可知,可知变量在7.98附近取值的频率最高,可见算法在此处收敛,并得到最优解plot(rbgaObj,type = "hist",breaks = 50)#当设置参数type = "vars"时,可得参数图,从图中可以看出,当变量值在7.98处时,评估值最低,对应全局最优plot(rbgaObj,type = "vars")
模型参数介绍
rbga(stringMin=c(), stringMax=c(),     suggestions=NULL,     popSize=200, iters=100,     mutationChance=NA,     elitism=NA,     monitorFunc=NULL, evalFunc=NULL,     showSettings=FALSE, verbose=FALSE)#stringMin  含有每个基因最小值的向量#stringMax  含有每个基因最大值的向量#suggestions    建议染色体可选列表#popSize       种群规模,个体数量,也是染色体数量,默认200#iters       迭代次数,默认为200#mutationChance  染色体的基因突变机会,默认为 1/(size+1),它影响收敛速度和搜索空间的探测,低的突变率收敛更加快,然而高的突变率增加搜索空间的跨度#elitism    保留到子代的染色体的数目,默认为为种群规模的20%#monitorFunc    监控函数,每产生一代后运行#evalFunc     用户自定义方法,计算给定染色体的适应度#showSettings     如果为TRUE,设置信息会打到屏幕上,默认FALSE#verbose        如果为TRUE,算法将会打印更多的动态信息,默认FALSE