当前位置: 首页 > news >正文

DAY12打卡 启发式算法

超参数调整专题2

  1. 三种启发式算法的示例代码:遗传算法、粒子群算法、退火算法
  2. 学习优化算法的思路(避免浪费无效时间)

作业:今天以自由探索的思路为主,尝试检索资料、视频、文档,用尽可能简短但是清晰的语言看是否能说清楚这三种算法每种算法的实现逻辑,帮助更深入的理解。

一.简述

启发式算法不是一步到位地找最优解,而是靠一些聪明的“试试看”的策略去找还不错的解决方案
它就像我们考试时不会做题,也会根据经验、直觉或者试探一步步尝试答案。

元启发式算法 = 从自然界学来的“找答案的策略模板”【例如火焰冷却(模拟退火)、生物进化(遗传算法)、鸟群觅食(粒子群)】

启发式算法 = 元启发式算法 + 针对问题的特征设计

二.启发式算法

1. 遗传算法 GA

模拟自然界中“优胜劣汰”和“基因遗传”的进化机制。每一代保留优质基因,通过“选择-交叉-变异”,不断优化解。

1)方法介绍:

1. 初始化一个种群(随机产生多个解)
2. 对每个个体计算适应度 f(x)
3. 选择适应度高的个体作为父母
4. 交叉父母,生成新个体
5. 可能发生变异(改变一部分基因)
6. 更新种群并迭代,直到满足停止条件

2)算法概述:
  • 适应度函数:评价每个解的优劣
    f(x)=x2f(x) = x^2f(x)=x2 本例中,x 越大,f(x) 越好,表示越优解。

  • 交叉操作

    将两个父母基因平均组合

  • 变异操作

    添加一个小的高斯随机数

    def fitness(x): return x**2  # 目标函数,越大越好
    def crossover(p1, p2): return (p1 + p2) / 2  # 简单均值交叉
    def mutation(x): return x + np.random.normal(0, 1)  # 加入正态扰动变异pop = np.random.uniform(-10, 10, 10)  # 初始种群10个个体#主循环,每代执行
    for gen in range(50):scores = [fitness(x) for x in pop]  # 计算每个个体的适应度parents = sorted(zip(scores, pop), reverse=True)[:2]  # 选出最优两个父母child = crossover(parents[0][1], parents[1][1])  # 交叉child = mutation(child)  # 变异pop[np.argmin(scores)] = child  # 用最差的个体替换为新生成的子代
    

2.粒子群算法PSO:

模拟鸟群觅食行为,每个“鸟”根据自己经验和群体经验调整方向,逐渐趋近最优食物点。

1)方法介绍

1. 初始化粒子位置和速度
2. 每个粒子记录:
   - 自己历史最优位置 p_best
   - 群体中最优位置 g_best
3. 更新粒子的速度和位置:

4. 更新个体最优和全局最优
5. 重复迭代

2)算法概述
x = np.random.uniform(-5, 5, n_particles)  # 粒子初始位置
v = np.zeros(n_particles)  # 初始速度为 0
p_best = x.copy()  # 每个粒子自身最优位置
g_best = x[np.argmax(f(x))]  # 全局最优位置#每代更新
v = 0.5 * v + 0.8 * (p_best - x) + 0.9 * (g_best - x)  # 速度更新
x += v  # 位置更新for i in range(n_particles):if f(x[i]) > f(p_best[i]):  # 更新个体最优p_best[i] = x[i]g_best = p_best[np.argmax([f(p) for p in p_best])]  # 更新全局最优

3.退火算法SA

模拟金属退火冷却过程,初期接受坏解(跳出局部最优),温度降低后只接受更优解。

1)方法介绍

1. 初始化当前解 x 和温度 T
2. 随机生成新解 x_new(邻域扰动)
3. 计算目标函数差值 ΔE = f(new) - f(old)
4. 若更优则接受新解;若更差则以概率 P = exp(-ΔE/T) 接受
5. 降低温度,重复
 

2)算法概述

x = np.random.uniform(-10, 10)  # 初始解
T = 100  # 初始温度#每次迭代
new_x = x + np.random.normal(0, 1)  # 邻域扰动
delta = f(new_x) - f(x)  # 解变差了多少
if delta < 0 or np.random.rand() < np.exp(-delta / T):x = new_x  # 根据概率接受
T *= 0.99  # 降低温度

@浙大疏锦行

http://www.xdnf.cn/news/657919.html

相关文章:

  • 基于yjs实现协同编辑页面
  • 学习黑客Metasploit 框架的原理
  • 端午假期 · 粽享欢乐
  • 开源Vue表单设计器 FcDesigner 组件提供的方法详解
  • 《1.1_4计算机网络的分类|精讲篇|附X-mind思维导图》
  • deepseek告诉您http与https有何区别?
  • CQF预备知识:一、微积分 -- 1.4.6 莱布尼茨法则详解
  • Mysql在SQL层面的优化
  • [Java实战]SpringBoot集成SNMP实现OID数据获取:原理、实践与测试(三十三)
  • GitLab 从 17.10 到 18.0.1 的升级指南
  • 动态规划-918.环形子数组的最大和-力扣(LeetCode)
  • SQL Driver
  • 16QAM通信系统设计与实现(上篇)——信号生成与调制技术(python版本)
  • leetcode 525. 连续数组
  • CertiK联创顾荣辉做客纽交所,剖析Bybit与Coinbase事件暴露的Web3安全新挑战
  • 原子操作(C++)
  • 深度体验:海螺 AI,开启智能创作新时代
  • liunx、ubantu22.04安装neo4j数据库并设置开机自启
  • AI工程师跑路了-SpringAi来帮忙
  • 学习路之PHP--easyswoole安装入门
  • LINUX安装运行jeelowcode前端项目
  • SC89171的介绍和使用
  • 炫云云渲染,构筑虚实交融的3D数字新视界
  • AI的“软肋”:架构设计与业务分析的壁垒
  • OpenCV CUDA模块图像过滤------创建一个行方向的一维积分(Sum)滤波器函数createRowSumFilter()
  • 爬虫IP代理效率优化:策略解析与实战案例
  • Neo4j(三) - 使用Java操作Neo4j详解
  • 第12次05: 用户中心-用户基本信息
  • 如何用ChatGPT提升学术长文质量
  • Golang Gin框架基础与实践指南