关闭

R语言遗传算法

标签: r语言遗传算法
606人阅读 评论(0) 收藏 举报
分类:

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
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:49654次
    • 积分:1370
    • 等级:
    • 排名:千里之外
    • 原创:89篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条
    文章存档
    最新评论