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

posted @ 2021-01-19 13:55  倦鸟已归时  阅读(156)  评论(0编辑  收藏  举报