我有一个具有多个局部最大值的函数。目标是使用模拟的退火算法找到全局最大值。解决方案应在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
}
}
请问有人可以在这里解释什么问题吗?