随机游走 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值