进化优化算法--第二章:爬山法
算法2.1: 最快上升爬山法
x0 <- 随机生成的个体
while not ( 终止准则)计算x0的适应度f(x0)For 每一个解的特征 q=1,2,,...nxq <- x0 用一个随机变异替换xq的第q个特征计算xq的适应度f(xq)获取下一个更优的解:寻找使f(xq)最大的xq, 令其等于x', x' <- argmax(f(xq)): q 属于[0,n]if x0 != x' thenx0 <- x'else:x0 保持不变
算法理解:该算法比较保守,每次只变化解的一个特征,并用某一个最好的特征变化来代替当前的解
终止准则:1. 迭代次数 2. 迭代解之间的差距和迭代次数,如迭代多少次之后,并且每次迭代解之间差距很小的时候就可以终止
代码实现及仿真:
def objective_function(x, y):c = 2 * math.pisum1 = 0sum2 = 0term1 = -0.2 * math.sqrt((x ** 2 + y ** 2) / 2)term2 = math.exp((math.cos(c * x) + math.cos(c * y)) / 2)y = math.exp(1) - 20 * math.exp(term1) - term2return ydef fastest_climb_mountains(func, times=1000):""" fastest climb mountains algorithm """x = [-5, 5]x0 = [rd.uniform(-5, 5), rd.uniform(-5, 5)]i = 1res = []while i <= times:f_x0 = func(x0[0], x0[1])f_xq = [0, 0]xq_1 = copy.deepcopy(x0)xq_2 = copy.deepcopy(x0)xq = [xq_1, xq_2]for j in range(2):xq[j][j] = rd.uniform(-5, 5)f_xq[j] = func(xq[j][0], xq[j][1])xq.append(x0)f_xq.append(f_x0)min_index = np.nanargmin(f_xq)new_f_x0 = f_xq[min_index]new_x0 = xq[min_index]if new_f_x0 != f_x0:x0 = copy.deepcopy(new_x0)res.append(func(x0[0], x0[1]))i += 1x_i = np.linspace(0, times, times)plt.title("Ackley function")plt.xlabel("x axis number of iterations")plt.ylabel("y axis objective value")plt.plot(x_i, res)plt.show()if __name__ == '__main__':fastest_climb_mountains(objective_function)
仿真结果:
算法2.2: 依次上升爬山法
x0 <- 随机生成的个体
while not ( 终止准则)计算x0的适应度f(x0)replaceFlag = falseFor 每一个解的特征 q=1,2,,...nxq <- x0 用一个随机变异替换xq的第q个特征计算xq的适应度f(xq)if f(xq) > f(x0):x0 <- xqreplaceFlag = trueendif获取下一个更优的解:寻找使f(xq)最大的xq, 令其等于x', x' <- argmax(f(xq)): q 属于[0,n]if not replaceFlag thenx0 保持不变endif
算法理解:该算法比较贪婪,每次只变化解的一个特征,只要变化的某一个特征比当前解好,那么就会替换当前的解
def ascending_climb_mountains(func, times=1000):x = [-5, 5]x0 = [rd.uniform(-5, 5), rd.uniform(-5, 5)]i = 1res = []while i <= times:f_x0 = func(x0[0], x0[1])minf = f_x0for j in range(2):xq = copy.deepcopy(x0)xq[j] = rd.uniform(-5, 5)f_xq = func(xq[0], xq[1])if f_xq < f_x0:x0 = copy.deepcopy(xq)f_x0 = func(x0[0], x0[1])replace = Trueres.append(f_x0)i += 1x_i = np.linspace(0, times, times)plt.title("Ackley function")plt.xlabel("x axis number of iterations")plt.ylabel("y axis objective value")plt.plot(x_i, res)plt.show()
相同的例子,算法2.2的仿真结果如下:
算法2.3: 随机变异爬山法
x0 <- 随机生成的个体
while not ( 终止准则)计算x0的适应度f(x0)q <- 从[1,n] 中随机选择解的特征x1 <- x0用一个随机变异的值替换x1的第q个特征计算x1的适应度f(x1)if f(x1) > f(x0):x0 <- x1endif
算法实现:
def random_mutation_climb_mountains(func, times=1000):x = [-5, 5]x0 = [rd.uniform(-5, 5), rd.uniform(-5, 5)]i = 1res = []while i <= times:f_x0 = func(x0[0], x0[1])q = rd.randint(0, 1)x1 = copy.deepcopy(x0)x1[q] = rd.uniform(-5, 5)f_x1 = func(x1[0], x1[1])if f_x1 < f_x0:x0 = copy.deepcopy(x1)f_x0 = func(x0[0], x0[1])res.append(f_x0)i += 1x_i = np.linspace(0, times, times)plt.title("Ackley function")plt.xlabel("x axis number of iterations")plt.ylabel("y axis objective value")plt.plot(x_i, res)plt.show()
算法理解:随机变异每次随机的选取变异的特征,每次迭代只需要计算一次适应度的值。
算法2.4: 自适应爬山法
初始化 pm 属于 [0,1] 作为变异概率
x0 <- 随机生成的个体
while not ( 终止准则)计算x0的适应度f(x0)x1 <- x0For 每一个解的特征 q = 1,2,3...,n生成一个均匀分布的随机数r 属于[0, 1]if r < pm then用一个随机变异替换x1的第q个特征endif计算x1的适应度f(x1)if f(x1) > f(x0):x0 <- x1endif
算法实现:
def adaptive_climb_mountains(func, times=1000, pm=0.3):x = [-5, 5]x0 = [rd.uniform(-5, 5), rd.uniform(-5, 5)]i = 1res = []f_x0 = func(x0[0], x0[1])while i <= times:x1 = copy.deepcopy(x0)for j in range(2):r = rd.uniform(0, 1)if r < pm:x1[j] = rd.uniform(-5, 5)f_x1 = func(x1[0], x1[1])if f_x1 < f_x0:x0 = copy.deepcopy(x1)f_x0 = func(x0[0], x0[1])res.append(f_x0)i += 1x_i = np.linspace(0, times, times)plt.title(f"Ackley function, pm={pm}")plt.xlabel("x axis number of iterations")plt.ylabel("y axis objective value")plt.plot(x_i, res)plt.show()
试验结果:
总结:爬山法可以用来求解确定性方法无法求解的优化问题,也跟更容易得到全局解,只要迭代次数足够多,但是每次的收敛速度可能是不一样的(将相同的代码运行多次,收敛速度不同,但是最后都收敛到了最优解)
进化优化算法--第二章:爬山法相关推荐
- Java算法--第二章--查找与排序(2)递归基础--佩波那契最大公约数插入排序汉诺塔
Java算法–第二章–查找与排序(2)递归基础 一.找重复 1.找到一种划分方法 2.找到递推公式或者等价转换 都是父问题转化为求解子问题 二.找变化的量 变化的量通常要作为参数 三.找出出口 代码: ...
- 自动驾驶决策规划算法第二章——Apollo EM Planner实践篇
前置学习内容:自动驾驶控制算法 [自动驾驶][零基础]基础自动驾驶控制算法笔记_免费教学录影带的博客-CSDN博客 自动驾驶决策规划第一章 自动驾驶决策规划算法第一章_免费教学录影带的博客-CSDN博 ...
- 信息学奥赛一本通(C++版)第二部分 基础算法 第二章 数据排序
第二章 数据排序 T1310 : 车厢重组 时间限制: 1000 ms 内存限制: 65536 KB [题目描述] 在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转.一个车站的职工 ...
- 斗地主AI算法——第二章の数据结构
上一章我们已经确立了基本的业务逻辑处理流程.从本章开始,我们便进入开发阶段. 首先就是明确我们都需要哪些数据,且它们以怎样的形式存储. 首先从上一章反复提到的手牌权值结构说起,也就是F()的返回值,他 ...
- 数据结构与算法第二章 线性表、栈、队列、数组、字符串、树、二叉树、哈希表的增删查
03 增删查:掌握数据处理的基本操作,以不变应万变 通过前面课时的学习,相信你已经建立了利用数据结构去完成时空转移的思想.接下来,你需要在理论思想的指导下灵活使用.其实,要想灵活使用数据结构,你需要先 ...
- 算法第二章实践上机实验报告
题目:二分法查找 问题描述:用二分法查找x,找到时输出x的下标和比较次数:找不到时输出-1和比较次数. 算法语言描述: 输入数组和要查找的数x 算法描述:将一个数组分为两半,设置一个中间量a[mid] ...
- 数据结构与算法--第二章pro题解
文章目录 ==模板== --双链表 ==模板==--循环双链表 1.双链表的基本运算 2:整数双链表的基本运算-3 3:整数双链表的基本运算-4 4:循环双链表的基本运算 模板 --双链表 struc ...
- 啊哈算法第二章 栈、队列、链表
一.队列.栈 作者在书中用数组来实现队列和栈,让我们更深刻地了解了底层实现.而这里我就直接放用STL里的queue和stack实现书中题目的代码了. 题目:纸牌游戏. 两人比赛,A,B,每人最开始分得 ...
- 斗地主AI算法——第一章の业务逻辑
转眼间快到了五月,帝都的天气也变的非常梦幻. 时而酷暑炎热,时而狂风席卷. 而不管外面如何,我们也只能在办公室里茕茕无依的撸着代码,无可奈何的负着韶华. 世界是寂寞的,寂寞到不只是寂寞,而是死一般的寂 ...
最新文章
- 1小时学会:最简单的iOS直播推流(七)h264/aac 硬编码
- 在AWS中部署OpenShift平台
- php统计播放量_php 怎么统计文章的访问量?
- Spring Cloud【Finchley】-04使用Ribbon实现客户端负载均衡
- CSS命名规则--参考表
- HTTP与HttpServlet
- java 空包_圆通快递接口,圆通快递礼品商城接口、圆通空包接口,圆通快递低价接口,礼品商城接口、一件代发接口...
- 可逆矩阵的秩等于矩阵的阶数_矩阵论一些总结点
- 杭电1596find the safest road
- 个人站立会议第二阶段04
- 常用编码软件简单使用记录 2 : 非自主编码器
- kubernetes集群管理工具k9s
- 解析MTK获取系统时间函数大全
- OpenCL 简单概念
- 大厂团队协作工具推荐
- win10电脑蓝屏自动修复失败无法开机的解决
- python_matplotlib改变横坐标和纵坐标上的刻度(ticks)
- 计算机视觉|投影与三维视觉
- 全球名校AI课程库(1)| 深度学习专项课程『Deep Learning Specialization』
- BitLocker密码破解工具--部分代码