当前位置:   article > 正文

随机游走 Random Walk

随机游走

随机游走是一种求全局最优的算法。

全局最优化是复杂的问题,目前没有通用的办法可以对任意复杂函数求解全局最优值。

梯度下降法:求解局部极小值的方法,对于求解精度不高的情况是实用的,可用局部极小值近似替代全局最小值点。但当要求求解全局最小值时,梯度下降法就不适用了,需要采用其他的办法求解。常见的求解全局最优的办法有拉格朗日法、线性规划法、以及一些人工智能算法比如遗传算法、粒子群算法、模拟退火算法等。

随机游走步骤

f(x) 为有 n 个变量的多元函数,x = (x1, x2, ..., xn) 为 n 维向量。

1. 给定初始点 x,步长 λ,精度 φ

2. 迭代次数 N, k为当前迭代次数,k=1

3. 当 k < N 时,随机生成(-1, 1) 的 n 维向量 u = (u1, u2, u3,...,un),

    标准化得到 u' = u / (sum(ui ^ 2)),i = 1, 2, 3...n。令 x1 = x + λ * u',这是第一步的游走。

4. 计算函数值,如 f(x1) < f(x),代表找到一个比初始值好的点,重置 k=1,x1 变为 x,

    回到第 2 步;否则 k = k + 1,回到第三步。

5. 如果连续 N 次都未找到最优值,则认为最优解为以当前最优解为中心,

    步长为半径的 N 维球内;如果 λ < φ,则算法结束,否则令 λ = λ / 2,回到第一步,重新游走。

Python 实例

import math
import randomdef target_func(x):
    '''
    目标函数:f = sin(r)/r + 1
    :param x:
    :return:
    '''
    r = math.sqrt((x[0]-50)**2 + (x[1]-50)**2) + math.e
    f = math.sin(r)/r + 1
    return -f

if __name__ == "__main__":
    N = 100  # 迭代次数
    step = 0.5  # 初始步长
    epsilon = 0.00001
    variables = 2  # 变量数目
    x = [49, 49]  # 初始点坐标
    walk_num = 1  # 初始化随机游走次数

    # 开始随机游走
    while (step > epsilon):
        k = 1  # 初始化计数器
        while (k < N):
            u = [random.uniform(-1, 1) for i in range(variables)]  # 随机向量
            # u1 为标准化之后的随机向量
            u1 = [u[i] / math.sqrt(sum([u[i] ** 2 for i in range(variables)])) for i in range(variables)]
            x1 = [x[i] + step * u1[i] for i in range(variables)]
            if (target_func(x1) < target_func(x)):  # 如果找到了更优点
                k = 1
                x = x1
            else:
                k += 1
        step = step / 2
        print("第%d次随机游走完成。" % walk_num)
        walk_num += 1
    print("随机游走次数:", walk_num - 1)
    print("最终最优点:", x)
    print("最终最优值:", target_func(x))c

参考:https://www.cnblogs.com/lyrichu/p/7209529.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/572164
推荐阅读
相关标签
  

闽ICP备14008679号