R语言模拟退火算法

说明

模拟退火是一种通用的概率算法,用来在一个大的搜索空间内找到命题的最优解

举例

在【0,12.55】上寻找f(x)=x*sin(x)在给定区域的最大值

#自定义目标函数
C = function(x)
{
  1/(x*sin(x)+12)
}

#初始化
stmp = NULL
for (i in 1:100) {stmp = c(stmp,runif(1,0,12.55))}
t0 = var(C(stmp))       #设定初始温度 var求方差
s0 = runif(1,0,12.55)   #设定初始解状态
iters = 3000            #设定迭代次数
ccnt = 200              #设定终止条件,连续ccnt个新解都没有接收时终止算法
hisbest = 12.55         #保存历史最好状态,默认取上边界值
ccntVc = NULL

for (t in 1:iters) 
{ 
   #在s0附近,产生新解,但又能包括定义内的所有值
   s1 = rnorm(1,mean = s0, sd = 2)
   while(s1<0 || s1>12.55)
   {
     s1 = rnorm(1,mean = s0, sd = 3)
   }
   #计算能量增量
   delta_t = C(s1) - C(s0)
   if(delta_t < 0)
   {
     s0 = s1
     ccntVc = c(ccntVc,1)
   }
   else
   {
     p = exp(-delta_t/t0)
     if(runif(1,0,1) < p)
     {
       s0 = s1
       ccntVc = c(ccntVc,1)
     }
     else
     {
       ccntVc = c(ccntVc,0)
     }
   }
   hisbest = ifelse(C(s1)#更新温度
   t0 = t0/log(1+t)
   #检查终止条件
   if(NROW(ccntVc)>ccnt && sum(ccntVc[(NROW(ccntVc)-ccnt+1):NROW(ccntVc)])==0)
     {
        print(paste("连续",ccnt,"次没有接受新解,算法终止!"))
        break;
     }
}
print(s0)
print(t)
print(hisbest)

R语言说明

#用R语言实现 
#R语言程序包GenSA和stats包括有模拟退火算法的实现。GenSA包可以执行非常复杂的非线性目标函数的全局最小化搜索
#而stats包中的optim函数是基于Nelder-Mead、拟牛顿法、共轭梯度算法的通用优化、它包括一个用于箱约束优化和模拟
#退火的选型
library(GenSA)
gensa0 = GenSA(par = runif(1,0,12.55),fn = function(s)1/(s*sin(s)+12),lower = c(0),upper = 12.55)
str(gensa0)
#List of 4
#$ value    : num 0.0502
#$ par      : num 7.98
#$ trace.mat: num [1:9992, 1:4] 1 1 2 2 3 3 4 4 5 5 ...
#..- attr(*, "dimnames")=List of 2
#.. ..$ : NULL
#.. ..$ : chr [1:4] "nb.steps" "temperature" "function.value" "current.minimum"
#$ counts   : int 35895

你可能感兴趣的:(R语言智能算法)