模拟退火以在Scala中找到全局最大值

时间:2019-11-18 13:54:21

标签: scala simulated-annealing

我有一个具有多个局部最大值的函数。目标是使用模拟的退火算法找到全局最大值。解决方案应在0.0001到0.2之间 我尝试了以下代码,但给出了错误的答案。摩尔,收敛非常慢。

object SimulatedAnnealing2 {

  private def acceptProbability (currentSolution: Double, newSolution: Double, temperature: Double) ={
    val diff = newSolution - currentSolution
    if(diff >1) 1.0 else math.exp(diff/temperature)
  }

  private def rand(min:Double, max: Double) = {
    val f = Random.nextFloat()
    min + f* (max- min)
  }

  def apply(f:Double => Double): Double = {
    var x = rand(0.0001,0.01)
    println("initial solution " + x )
    var xm = x
    val tI = 100.0
    val coolingRate = 0.3
    var T = tI
    var maxi = f(x)
    var z = 0.0
    while (T > coolingRate) {
      var i = 1
      while(i<= 30) {
        x += rand(-0.002, 0.002)
        z = f(x)
        if (z > maxi || acceptProbability(maxi, z, T) > 0.43) {
          println("new x" + x + ": " + z)
          maxi = z
          xm = x
        }
        i += 1
      }
      T= T* (1-coolingRate)
    }
    xm
  }
}

请问有人可以在这里解释什么问题吗?

0 个答案:

没有答案