赞
踩
随机游走是一种求全局最优的算法。
全局最优化是复杂的问题,目前没有通用的办法可以对任意复杂函数求解全局最优值。
梯度下降法:求解局部极小值的方法,对于求解精度不高的情况是实用的,可用局部极小值近似替代全局最小值点。但当要求求解全局最小值时,梯度下降法就不适用了,需要采用其他的办法求解。常见的求解全局最优的办法有拉格朗日法、线性规划法、以及一些人工智能算法比如遗传算法、粒子群算法、模拟退火算法等。
随机游走步骤
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。