R语言遗传算法

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
    原文作者:遗传算法
    原文地址: https://blog.csdn.net/dingming001/article/details/76284246
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞