关闭

R语言遗传算法

标签: r语言遗传算法
1235人阅读 评论(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
查看评论

转载R语言实现遗传算法

转自:http://blog.fens.me/algorithm-ga-r/ 在R语言中,有一些现成的第三方包已经实现的遗传算法,我们可以直接进行使用。mcga包,多变量的遗传算法,用于求解多维函数的最小值。 genalg包,多变量的遗传算法,用于求解多维函数的最小值。 rgenoud包,复杂...
  • hill_night
  • hill_night
  • 2015-05-29 21:30
  • 3149

利用R写遗传算法

利用R写遗传算法遗传算法的参数通常包括以下几个:种群规模(Population),即种群中染色体个体的数目。 染色体的基因个数(Size),即变量的数目。 交配概率(Crossover),用于控制交叉计算的使用频率。交叉操作可以加快收敛,使解达到最有希望的最优解区域,因此一般取较大的交叉概率,但...
  • u013946794
  • u013946794
  • 2015-03-19 20:45
  • 2766

遗传算法简介

今天来讲遗传算法,遗传算法有很多应用,比如寻路问题,八数码问题,囚犯困境问题,动作控制,TSP问题,生产 调度问题,在一个多边形中寻找一个包含在该多边形内的一个圆,函数求最值问题等等。之前讲的模拟退火算法是用 来求解最优化问题的,链接为:http://blog.csdn.net/acdreamers...
  • ACdreamers
  • ACdreamers
  • 2015-01-05 19:29
  • 5115

非常好的理解遗传算法的例子

遗传算法的手工模拟计算示例为更好地理解遗传算法的运算过程,下面用手工计算来简单地模拟遗传算法的各    个主要执行步骤。       例:求下述二元函数的最大值:    (1) 个...
  • b2b160
  • b2b160
  • 2009-10-16 15:07
  • 344103

R语言遗传算法

R语言中有程序包实现了遗传算法,通常使用mcga\genalg\rgenoudmcga包。
  • dingming001
  • dingming001
  • 2017-07-28 22:37
  • 1235

(R语言)GA遗传算法并行化实现

  • 2017-11-13 10:09
  • 11KB
  • 下载

遗传算法的c程序

程序代码: (代码标记  [code]...[/code]  )#includeiostream.h>#includemath.h>#includetime.h>//#include#includestdlib.h>#incl...
  • superdont
  • superdont
  • 2007-04-18 19:07
  • 6103

遗传算法的C语言实现(二)

上一次我们使用遗传算法求解了一个较为复杂的多元非线性函数的极值问题,也基本了解了遗传算法的实现基本步骤。这一次,我再以经典的TSP问题为例,更加深入地说明遗传算法中选择、交叉、变异等核心步骤的实现。而且这一次解决的是离散型问题,上一次解决的是连续型问题,刚好形成对照。   ...
  • tyfbhlxd
  • tyfbhlxd
  • 2017-05-14 18:19
  • 968

R语言与网站分析:数据集样例及分类算法实现

  • 2016-02-23 23:34
  • 4KB
  • 下载

R语言实现常用算法

# 选择排序 @ auther: wangcaixia selectSort <- function(arr){ len <- length(arr) if(len <= 1) return(arr) for(i in 1:(len-1) ){ for (j in...
  • wangcaixia0826
  • wangcaixia0826
  • 2016-03-05 21:59
  • 88
    个人资料
    • 访问:92877次
    • 积分:1907
    • 等级:
    • 排名:千里之外
    • 原创:98篇
    • 转载:0篇
    • 译文:0篇
    • 评论:5条
    文章分类
    最新评论