zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    【BZOJ】【1662】/【POJ】【3252】 【USACO 2006 Nov】Round Number
    【BZOJ】【1026】【SCOI2009】Windy数
    【HDOJ】【3555】Bomb
    【HDOJ】【2089】不要62
    【Ural】【1057】Amount of degrees
    【POJ】【3710】Christmas Game
    【BZOJ】【2940】【POI2000】条纹
    【POJ】【3537】Crosses and Crosses
    【POJ】【2068】Nim
    【POJ】【2960】S-Nim
  • 原文地址:https://www.cnblogs.com/zhaoke271828/p/14297583.html
Copyright © 2011-2022 走看看