利用R写遗传算法

利用R写遗传算法

遗传算法的参数通常包括以下几个:

种群规模(Population),即种群中染色体个体的数目。
染色体的基因个数(Size),即变量的数目。
交配概率(Crossover),用于控制交叉计算的使用频率。交叉操作可以加快收敛,使解达到最有希望的最优解区域,因此一般取较大的交叉概率,但交叉概率太高也可能导致过早收敛。
变异概率(Mutation),用于控制变异计算的使用频率,决定了遗传算法的局部搜索能力。
中止条件(Termination),结束的标志。
在R语言中,有一些现成的第三方包已经实现的遗传算法,我们可以直接进行使用。

mcga包,多变量的遗传算法,用于求解多维函数的最小值。
genalg包,多变量的遗传算法,用于求解多维函数的最小值。
rgenoud包,复杂的遗传算法,将遗传算法和衍生的拟牛顿算法结合起来,可以求解复杂函数的最优化化问题。
gafit包,利用遗传算法求解一维函数的最小值。不支持R 3.1.1的版本。
GALGO包,利用遗传算法求解多维函数的最优化解。不支持R 3.1.1的版本。
本文将介绍mcga包和genalg包的遗传算法的使用。

1 mcga包

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

mcga包是一个遗传算法快速的工具包,主要解决实值优化的问题。它使用的变量值表示基因序列,而不是字节码,因此不需要编解码的处理。mcga实现了遗传算法的交配和突变的操作,并且可以进行大范围和高精度的搜索空间的计算,算法的主要缺点是使用了256位的一元字母表。

首先,安装mcga包。

install.packages(“mcga”)
library(mcga)
查看一下mcga()函数的定义。

mcga
function (popsize, chsize, crossprob = 1, 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,适应度函数,用于给个体进行评价
接下来,我们给定一个优化的问题,通过mcga()函数,计算最优化的解。

题目1:设fx=(x1-5)^2 + (x2-55)^2 +(x3-555)^2 +(x4-5555)^2 +(x5-55555)^2,计算fx的最小值,其中x1,x2,x3,x4,x5为5个不同的变量。

从直观上看,如果想得到fx的最小值,其实当x1=5,x2=55,x3=555,x4=5555,x5=55555时,fx=0为最小值。如果使用穷举法,通过循环的方法找到这5个变量,估计会很费时的,我就不做测试了。下面我们看一下遗传算法的运行情况。

定义适应度函数

f<-function(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,])
[1] 5.000317 54.997099 554.999873 5555.003120 55554.218695

执行时间

m$costs[1]
[1] 3.6104556
我们得到的最优化的结果为x1=5.000317, x2=54.997099, x3=554.999873, x4=5555.003120, x5=55554.218695,和我们预期的结果非常接近,而且耗时只有3.6秒。这个结果是非常令人满意地,不是么!如果使用穷举法,时间复杂度为O(n^5),估计没有5分钟肯定算不出来。

当然,算法执行时间和精度,都是通过参数进行配置的。如果增大个体数目或循环次数,一方面会增加算法的计算时间,另一方面结果也可能变得更精准。所以,在实际的使用过程中,需要根据一定的经验调整这几个参数。

你可能感兴趣的:(R学习经)