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

30天打牢数模基础-模拟退火算法讲解

二、完整Python代码

import random
import mathdef rastrigin(x, y):"""二维Rastrigin函数(目标函数,需最小化)参数:x: 自变量xy: 自变量y返回:函数值f(x,y)"""return 20 + x**2 + y**2 - 10 * math.cos(2 * math.pi * x) - 10 * math.cos(2 * math.pi * y)def simulated_annealing(T0=100, alpha=0.9, L=100, T_end=1e-5):"""模拟退火算法实现(解决二维Rastrigin函数最小化问题)参数:T0: 初始温度(默认100,越大探索越充分)alpha: 温度衰减系数(默认0.9,0.8-0.95之间,越小降温越快)L: 每个温度下的迭代次数(默认100,越大搜索越充分)T_end: 停止温度(默认1e-5,越小收敛越彻底)返回:best_solution: 全局最优解(x,y)best_value: 全局最优目标函数值"""# 1. 初始化当前解(随机生成x,y ∈ [-5.12, 5.12])x = random.uniform(-5.12, 5.12)y = random.uniform(-5.12, 5.12)current_sol = (x, y)  # 当前解(tuple)current_val = rastrigin(x, y)  # 当前解的目标函数值# 2. 初始化最好解(初始时最好解为当前解)best_sol = current_solbest_val = current_val# 3. 温度循环(从高温到低温)T = T0  # 当前温度while T > T_end:# 4. 每个温度下的迭代(搜索当前温度下的解空间)for _ in range(L):# a. 生成新解(在当前解附近随机扰动,用正态分布,标准差与温度相关)# 温度越高,扰动越大(探索范围广);温度越低,扰动越小(聚焦局部)new_x = current_sol[0] + random.gauss(0, T**0.5)  # 正态分布扰动xnew_y = current_sol[1] + random.gauss(0, T**0.5)  # 正态分布扰动y# b. 截断新解(确保x,y在定义域[-5.12, 5.12]内)new_x = max(min(new_x, 5.12), -5.12)new_y = max(min(new_y, 5.12), -5.12)new_sol = (new_x, new_y)  # 新解new_val = rastrigin(new_x, new_y)  # 新解的目标函数值# c. 计算目标函数差(新解 - 当前解)delta_f = new_val - current_val# d. Metropolis准则:判断是否接受新解if delta_f <= 0:# 情况1:新解更好(目标函数值更小),直接接受current_sol = new_solcurrent_val = new_val# 更新最好解(如果新解比当前最好解更好)if new_val < best_val:best_sol = new_solbest_val = new_valelse:# 情况2:新解更差,以概率exp(-delta_f/T)接受prob = math.exp(-delta_f / T)  # 接受概率(温度越高,概率越大)if random.random() < prob:  # 生成0-1随机数,小于prob则接受current_sol = new_solcurrent_val = new_val# 5. 温度衰减(指数衰减:T = alpha * T)T *= alpha# 6. 返回最好解和最好目标函数值return best_sol, best_valif __name__ == "__main__":# ---------------------- 参数设置(小白可调整) ----------------------T0 = 100      # 初始温度(推荐值:50-200)alpha = 0.9   # 衰减系数(推荐值:0.8-0.95)L = 100       # 每个温度下的迭代次数(推荐值:50-200)T_end = 1e-5  # 停止温度(推荐值:1e-4-1e-6)# -------------------------------------------------------------------# 运行模拟退火算法best_sol, best_val = simulated_annealing(T0, alpha, L, T_end)# 输出结果print("="*50)print("模拟退火算法求解二维Rastrigin函数最小值结果:")print(f"全局最优解(x, y):({best_sol[0]:.4f}, {best_sol[1]:.4f})")print(f"全局最优目标函数值:{best_val:.4f}")print(f"理论全局最小值:0(对应解(0,0))")print("="*50)

三、代码使用说明

1.环境准备

安装Python(推荐3.7及以上版本,下载地址:https://www.python.org/downloads/)。

无需额外安装第三方库(代码使用Python标准库random和math)。

2.运行代码

将代码保存为sa_rastrigin.py(或任意文件名)。

打开命令行(Windows:Win+R输入cmd;Mac:Launchpad搜索终端),进入代码所在目录,运行:

Python sa_rastrigin.py

3.参数调整说明(小白重点)

代码中的T0(初始温度)、alpha(衰减系数)、L(每个温度下的迭代次数)是核心可调参数,影响算法性能:

初始温度T0

越大:算法初期探索范围越广(敢接受差解),越不容易陷入局部最优,但计算时间越长。

推荐值:50-200(比如T0=100)。

衰减系数alpha

越小:温度下降越快(比如alpha=0.8,10次迭代后温度从100降到100*0.8^10≈10.7),计算时间短,但可能提前收敛到局部最优。

越大:温度下降越慢(比如alpha=0.95,10次迭代后温度≈59.8),探索更充分,但计算时间长。

推荐值:0.8-0.95(比如alpha=0.9)。

每个温度下的迭代次数L

越大:每个温度下搜索越充分(比如L=200,每个温度下尝试200次新解),越可能找到更好的解,但计算时间越长。

推荐值:50-200(比如L=100)。

4.结果解释

运行代码后,会输出类似以下结果(因随机种子不同,结果略有差异):

==================================================
模拟退火算法求解二维Rastrigin函数最小值结果:
全局最优解(x, y):(0.0012, -0.0008)
全局最优目标函数值:0.0002
理论全局最小值:0(对应解(0,0))
==================================================

全局最优解:接近(0,0)(理论全局最优解)。

全局最优目标函数值:接近0(理论全局最小值)。

四、拓展建议(小白进阶)

可视化结果:可以用matplotlib库绘制Rastrigin函数图像和算法搜索路径,更直观看到算法如何从“乱撞”到“收敛”。

解决其他问题:将rastrigin函数替换为其他优化问题的目标函数(比如TSP的总距离、背包问题的总价值),即可用该代码解决其他优化问题(需调整新解生成方式,比如TSP用交换城市位置)。

通过本案例,小白可以掌握模拟退火算法的核心逻辑(Metropolis准则、温度衰减)和代码实现,并能调整参数解决实际优化问题。

http://www.dtcms.com/a/289619.html

相关文章:

  • 零基础100天CNN实战计划:用Python从入门到图像识别高手
  • k8s:离线添加集群节点
  • Java中的ScopeValue 使用详解
  • 深入解析业务代表模式:解耦表示层与业务层的利器
  • 列空间与零空间,秩—零化度定理
  • ( LeetCode 面试经典 150 题 ) 202. 快乐数 (快慢指针)
  • [simdjson] `error_code` | .get() | 异常 | is_fatal() | current_location() | 链式处理
  • 限流算法与实现
  • MySQL锁(一) 概述与分类
  • CMSIS-RTOS线程创建osThreadNew
  • JAVA国际版任务悬赏+接单系统源码支持IOS+Android+H5
  • 代码随想录算法训练营二十一天|回溯part03
  • IDEA使用技巧
  • c/c++-memory-management
  • ansible awx自动化工具学习准备
  • 牛客-两个链表的第一个公共节点
  • 安全信息与事件管理(SIEM)系统架构设计
  • TypeScript 中替代 Interface 的方案
  • PLC(可编程逻辑控制器,Programmable Logic Controller)是什么?
  • 详解如何解决Mysql主从复制延迟
  • 脚本代码:网页限制解除(改)
  • 树同构(Tree Isomorphism)
  • 生成模型与判别模型
  • 虚拟机VMware安装国产桌面系统统信UOS
  • Nginx服务器基本搭建
  • 【性能测试】性能压测3个阶段+高频面试题回答(详细)
  • 大语言模型:人像摄影的“达芬奇转世”?——从算法解析到光影重塑的智能摄影革命
  • 机器学习基础:从数据到智能的入门指南
  • 【数据集】NOAA 全球监测实验室(GML)海洋边界层(MBL)参考简介
  • 渗透笔记(XSS跨站脚本攻击)