r

来源:互联网 发布:淘宝网2017新款包包 编辑:程序博客网 时间:2024/06/02 17:11

mcga包

我们使用mcga包的mcga()函数,可以实现多变量的遗传算法。

mcga包是一个遗传算法快速的工具包,主要解决实值优化的问题。它使用的变量值表示基因序列,而不是字节码,因此不需要编解码的处理。mcga实现了遗传算法的交配和突变的操作,并且可以进行大范围和高精度的搜索空间的计算,算法的主要缺点是使用了256位的一元字母表。
例1:设fx=(x1-5)^2 + (x2-55)^2 +(x3-555)^2 +(x4-5555)^2 +(x5-55555)^2,计算fx的最小值,其中x1,x2,x3,x4,x5为5个不同的变量。
首先,安装mcga包。

library(mcga)

参数说明:

popsize,个体数量,即染色体数目
chsize,基因数量,限参数的数量
crossprob,交配概率,默认为1.0
mutateprob,突变概率,默认为0.01
elitism,精英数量,直接复制到下一代的染色体数目,默认为1
minval,随机生成初始种群的下边界值
maxval,随机生成初始种群的上边界值
maxiter,繁殖次数,即循环次数,默认为10
evalFunc,适应度函数,用于给个体进行评价
接下来,我们给定一个优化的问题,通过mcga()函数,计算最优化的解。

f<-function(x){x1<-0;x2<-0;x3<-0;x4<-0;x5<-0;x=(x1-5)^2+(x2-55)^2+(x3-555)^2+(x4-5555)^2+(x5-55555)^2;min(x)}m <- mcga(popsize=200,chsize=5,  minval=0.0, maxval=999999,  maxiter=2500, crossprob=1.0, mutateprob=0.01, evalFunc=f)print(m$population[1,])

genalg包
从直观上看,如果想得到fx的最小值,其实当x1=sqrt(exp(1))=1.648721, x2=log(pi)=1.14473时,fx=0为最小值。同样地,如果使用穷举法,通过循环的方法找到这2个变量,估计会很费时的,我也不做测试了。下面我们看一下rbga()函数的遗传算法的运行情况。
参数说明:

stringMin,设置每个基因的最小值
stringMax,设置每个基因的最大值
suggestions,建议染色体的可选列表
popSize,个体数量,即染色体数目,默认为200
iters,迭代次数,默认为100
mutationChance,突变机会,默认为1/(size+1),它影响收敛速度和搜索空间的探测,低机率导致更快收敛,高机率增加了搜索空间的跨度。
elitism,精英数量,默认为20%,直接复制到下一代的染色体数目
monitorFunc,监控函数,每产生一代后运行
evalFunc,适应度函数,用于给个体进行评价
showSettings,打印设置,默认为false
verbose,打印算法运行日志,默认为false
接下来,我们给定一个优化的问题,通过rbga()函数,计算最优化的解。

library(genalg)?rbgaevaluate <- function(string=c()) {    returnVal = NA;    if (length(string) == 2) {        returnVal = abs(string[1]-pi) + abs(string[2]-sqrt(50));    } else {        stop("Expecting a chromosome of length 2!");    }    returnVal}monitor <- function(obj) {    # plot the population    xlim = c(obj$stringMin[1], obj$stringMax[1]);    ylim = c(obj$stringMin[2], obj$stringMax[2]);    plot(obj$population, xlim=xlim, ylim=ylim,     xlab="pi", ylab="sqrt(50)");}rbga.results = rbga(c(1, 1), c(5, 10), monitorFunc=monitor,     evalFunc=evaluate, verbose=TRUE, mutationChance=0.01)plot(rbga.results)plot(rbga.results, type="hist")plot(rbga.results, type="vars")
0 0