算法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()

试验结果:

总结:爬山法可以用来求解确定性方法无法求解的优化问题,也跟更容易得到全局解,只要迭代次数足够多,但是每次的收敛速度可能是不一样的(将相同的代码运行多次,收敛速度不同,但是最后都收敛到了最优解

进化优化算法--第二章:爬山法相关推荐

  1. Java算法--第二章--查找与排序(2)递归基础--佩波那契最大公约数插入排序汉诺塔

    Java算法–第二章–查找与排序(2)递归基础 一.找重复 1.找到一种划分方法 2.找到递推公式或者等价转换 都是父问题转化为求解子问题 二.找变化的量 变化的量通常要作为参数 三.找出出口 代码: ...

  2. 自动驾驶决策规划算法第二章——Apollo EM Planner实践篇

    前置学习内容:自动驾驶控制算法 [自动驾驶][零基础]基础自动驾驶控制算法笔记_免费教学录影带的博客-CSDN博客 自动驾驶决策规划第一章 自动驾驶决策规划算法第一章_免费教学录影带的博客-CSDN博 ...

  3. 信息学奥赛一本通(C++版)第二部分 基础算法 第二章 数据排序

    第二章 数据排序 T1310 : 车厢重组 时间限制: 1000 ms 内存限制: 65536 KB [题目描述]   在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转.一个车站的职工 ...

  4. 斗地主AI算法——第二章の数据结构

    上一章我们已经确立了基本的业务逻辑处理流程.从本章开始,我们便进入开发阶段. 首先就是明确我们都需要哪些数据,且它们以怎样的形式存储. 首先从上一章反复提到的手牌权值结构说起,也就是F()的返回值,他 ...

  5. 数据结构与算法第二章 线性表、栈、队列、数组、字符串、树、二叉树、哈希表的增删查

    03 增删查:掌握数据处理的基本操作,以不变应万变 通过前面课时的学习,相信你已经建立了利用数据结构去完成时空转移的思想.接下来,你需要在理论思想的指导下灵活使用.其实,要想灵活使用数据结构,你需要先 ...

  6. 算法第二章实践上机实验报告

    题目:二分法查找 问题描述:用二分法查找x,找到时输出x的下标和比较次数:找不到时输出-1和比较次数. 算法语言描述: 输入数组和要查找的数x 算法描述:将一个数组分为两半,设置一个中间量a[mid] ...

  7. 数据结构与算法--第二章pro题解

    文章目录 ==模板== --双链表 ==模板==--循环双链表 1.双链表的基本运算 2:整数双链表的基本运算-3 3:整数双链表的基本运算-4 4:循环双链表的基本运算 模板 --双链表 struc ...

  8. 啊哈算法第二章 栈、队列、链表

    一.队列.栈 作者在书中用数组来实现队列和栈,让我们更深刻地了解了底层实现.而这里我就直接放用STL里的queue和stack实现书中题目的代码了. 题目:纸牌游戏. 两人比赛,A,B,每人最开始分得 ...

  9. 斗地主AI算法——第一章の业务逻辑

    转眼间快到了五月,帝都的天气也变的非常梦幻. 时而酷暑炎热,时而狂风席卷. 而不管外面如何,我们也只能在办公室里茕茕无依的撸着代码,无可奈何的负着韶华. 世界是寂寞的,寂寞到不只是寂寞,而是死一般的寂 ...

最新文章

  1. 1小时学会:最简单的iOS直播推流(七)h264/aac 硬编码
  2. 在AWS中部署OpenShift平台
  3. php统计播放量_php 怎么统计文章的访问量?
  4. Spring Cloud【Finchley】-04使用Ribbon实现客户端负载均衡
  5. CSS命名规则--参考表
  6. HTTP与HttpServlet
  7. java 空包_圆通快递接口,圆通快递礼品商城接口、圆通空包接口,圆通快递低价接口,礼品商城接口、一件代发接口...
  8. 可逆矩阵的秩等于矩阵的阶数_矩阵论一些总结点
  9. 杭电1596find the safest road
  10. 个人站立会议第二阶段04
  11. 常用编码软件简单使用记录 2 : 非自主编码器
  12. kubernetes集群管理工具k9s
  13. 解析MTK获取系统时间函数大全
  14. OpenCL 简单概念
  15. 大厂团队协作工具推荐
  16. win10电脑蓝屏自动修复失败无法开机的解决
  17. python_matplotlib改变横坐标和纵坐标上的刻度(ticks)
  18. 计算机视觉|投影与三维视觉
  19. 全球名校AI课程库(1)| 深度学习专项课程『Deep Learning Specialization』
  20. BitLocker密码破解工具--部分代码

热门文章

  1. 零基础学基金投资系列-08-基金排行榜
  2. 使用 JDB 调试 Android 应用程序
  3. (第2课)【初识python爬虫】
  4. 写一篇讲解优芽动画知识的教案
  5. 什么是OsmocomBB
  6. 苹果发布黄色版 iPhone 14,定价 5999 元起;大神李沐被曝离职投身大模型创业;Atlassian 裁员 |极客头条
  7. 华为交换机升级包及补丁验证完整性
  8. PaddleNLP系列课程一:Taskflow、小样本学习、FasterTransformer
  9. 一键制作所有微信好友头像墙照
  10. 关于苹果公证(Apple Notarizition)机制的一些总结