当前位置: 首页 > 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  # 降低温度

@浙大疏锦行

相关文章:

  • 华润电力招聘认知能力测评及性格测评真题题库考什么?
  • yolov8,c++案例汇总
  • 2025 河北ICPC( D. 金泰园(二分)-- C.年少的誓约(公式转化))
  • CentOS7安装 htop(100% 可以安上)
  • 【前端】Proxy对象在控制台中惰性求值_vue常见开发问题
  • 华为OD机试真题——斗地主之顺子(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • 《因果关系的精准捕捉术:注意力机制的深层解码逻辑》
  • 【读书笔记】《编码:隐匿在计算机软硬件背后的语言》02 门
  • 时间的基本概念及相关技术
  • Day37打卡 @浙大疏锦行
  • P2015 二叉苹果树
  • 学习黑客Metasploit 框架的原理
  • C++面试题:虚函数表(vtable)的底层实现机制与应用解析
  • 鸿蒙OSUniApp 制作个性化的评分星级组件#三方框架 #Uniapp
  • SWOT分析:MCP(Model Context Protocol)与传统编程解决方案
  • 快速上手SHELL脚本基础及变量与运算
  • 【Pycharm】文件夹一直显示正在加载
  • 【unity游戏开发——编辑器扩展】Gizmos可视化辅助工具
  • Linux中SHELL脚本常用命令
  • 充电枪IEC62196/EN 62196测试内容
  • 外贸网站联系方式模板免费/专业排名优化工具
  • 企业网站可以自己做/网站流量统计平台
  • 武汉百度推广设计/网站在线优化工具
  • 网站空间的根目录/seo深圳优化
  • 国外商业网站建设/网络营销方法有哪些举例
  • 企业网络搭建服务/百度关键词优化推广