Go语言 爬山算法
求解复杂方程的最优解通常采用迭代的算法来逼近全局最优解,其中几乎都是启发式搜索算法。
爬山算法也是一种启发式算法,但是它不能得到全局最优解,只能得到局部最优解。即便如此,作为最简单的启发式算法,学习爬山算法有利于快速明确智能算法的基本概念。
首先获得初始解,定义适应度函数并计算出初始适应度。
然后确定迭代次数,或者终止迭代的精度限制。
每一次迭代中,首先利用某种方法获得新解,计算新解的适应度。
比较新解和旧解的适应度,取适应度较小的解进入下一次迭代。
Go语言代码:
package main import ( "fmt" "math" "math/rand" ) //适应度函数 func evaluate(x float64) float64 { return math.Tan(math.Sin(x)) - math.Sin(math.Tan(x)) } func main() { const x_lb = -math.Pi //定义域下界 const x_ub = -1 //定义域上界 var firstX float64 = x_lb + (x_ub-x_lb)*rand.Float64() //初始解 var currentX float64 = firstX // 当前最好的姐 fmt.Println("x0: ", firstX, "; func(x0): ", evaluate(firstX)) const MAX_ITER int = 200 // 最大迭代次数 const step float64 = 0.03 // 搜索步长 var currentRes float64 var bestRes float64 for i := 0; i < MAX_ITER; i++ { currentRes = evaluate(currentX) bestRes = currentRes var newX float64 if currentX-step > x_lb && currentX-step < x_ub { newX = currentX - step } else if currentX+step > x_lb && currentX+step < x_ub { newX = currentX + step } else { } res := evaluate(newX) if res < currentRes { currentX = newX currentRes = res bestRes = res } } fmt.Println("x: ", currentRes, "; best result: ", bestRes) fmt.Println("best value: ", evaluate(bestRes)) }
运行结果:
x0: -1.846656622935151 ; func(x0): -1.053920325545232
x: -2.1685816511557823 ; best result: -2.1685816511557823
best value: -2.0807499644895375