二、完整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.pswp.cn/diannao/91983.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/91983.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/91983.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读 - FastInst

文章目录1 概述2 模型说明2.1 总体架构2.2 轻量pixel decoder2.3 实例激活引导的Query2.4 双路径更新策略2.5 GT掩码引导学习2.6 损失函数3 效果1 概述 FastInst是一种基于query的实时实例分割方法&#xff0c;它能以32.5FPS的实时速度在COCO测试集上达到40.5的AP。在实例分割…

Elasticsearch 9.x 高可用集群部署教程(3 主节点 + 3 数据节点)

Elasticsearch 9.x 高可用集群部署教程(3 主节点 + 3 数据节点) 1. 集群架构规划 生产环境中的 Elasticsearch 集群需要高可用性和容错能力。以下是基于 3 主节点 + 3 数据节点的架构规划: 节点分布: 主节点(Master Nodes):3 台(master-node-1, master-node-2, maste…

Unity_通过鼠标点击屏幕移动屏幕里的一个对象

文章目录一、获取到点击物体的Tansform&#xff08;摁下鼠标左键的瞬间&#xff09;二、移动点击的物体&#xff08;摁着鼠标左键不放&#xff09;三、松开左键清理被移动对象属性总结注&#xff1a;本文章只是学习总结的笔记&#xff0c;视频链接 一、获取到点击物体的Tansfor…

UDP中的单播,多播,广播(代码实现)

文章目录1. UDP 单播&#xff08;Unicast&#xff09;示例2. UDP 广播&#xff08;Broadcast&#xff09;示例3. UDP 多播&#xff08;Multicast&#xff09;示例3.1 多播发送方示例3.2 多播接收方示例总结1. UDP 单播&#xff08;Unicast&#xff09;示例 发送方向指定单个目…

神经网络:卷积层

神经网络 卷积操作 例子&#xff1a; 输入&#xff1a;二维图像 [1,2,0,3,1] [0,1,2,3,1] [1,2,1,0,0] [5,2,3,1,1] [2,1,0,1,1] 卷积核&#xff1a; [1,2,1] [0,1,0] [2,1,0] 然后需要将输入图像和卷积核转化为4维张量 为什么转为4维张量&#xff1f;因为卷积操作需要输入图像…

2.4 组件间通信Props(父传子)

父组件 在父组件模板上的子组件上加上属性值&#xff0c;属性值就是想要传递给子组件的信息。 例如&#xff1a; <template> <div class"Big-box"><testBox :personList"p"></testBox> </div> </template>子组件 子组…

从零开始学习 Redux:React Native 项目中的状态管理

Redux 是一个用于 JavaScript 应用程序的状态管理库&#xff0c;通常与 React 或 React Native 配合使用&#xff0c;帮助管理应用的状态和数据流。其核心原理是通过集中式的“单一数据源”来管理应用状态&#xff0c;避免组件之间的“层层传递”状态和副作用。 Redux 的原理单…

[特殊字符] CentOS 7 离线安装 MySQL 5.7 实验

&#x1f427; CentOS 7 离线安装 MySQL 5.7 实验 针对企业无互联网环境的系统&#xff0c;设计了如何在 CentOS 7 系统中&#xff0c;使用一台可以联网的主机&#xff08;NodeA&#xff09;为另一台无法联网的主机&#xff08;NodeB&#xff09;安装 MySQL 5.7 数据库及其依赖…

Redis 概率型数据结构实战指南

1. 为什么要用「近似」&#xff1f; 随着业务量爆发式增长&#xff0c;精确统计 的内存或 CPU 成本可能难以接受。例如&#xff1a; 统计一天内 唯一 IP 数 —— 用 SET 精确去重&#xff0c;百万 IP→占用数百 MB。统计海量商品销量、实时计算 P99 延迟、获取 TOP-N 热门页面……

Android开发工程师:Linux一条find grep命令通关搜索内容与文件

find . -type f \( -name "*.java" -o -name "*.xml" \) -not -path "./out/*" -exec grep -irnE activity|class {} 多关键词搜索&#xff1a;使用正则表达式 pattern1|pattern2 同时搜索多个关键词&#xff08;如 activity|class&#xff09;单…

深入理解浏览器解析机制和XSS向量编码

URL 编码 "javascript:alert(1)"---->%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29<a href"%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">aaa</a>-------浏览器解析不了。 页面识别在url解码之前&#xff0c;在…

ThinkPHP8极简上手指南:开启高效开发之旅

目录一、环境搭建1.1 安装 PHP1.2 安装 Composer二、安装 ThinkPHP8三、目录结构解析四、第一个简单示例&#xff1a;Hello, ThinkPHP84.1 创建控制器4.2 编写控制器方法4.3 配置路由4.4 访问测试五、进阶示例&#xff1a;数据库查询5.1 配置数据库连接5.2 创建模型5.3 编写查询…

智能制造之物料详解

在制造业业务系统中&#xff0c;物料流转贯穿“需求→采购→入库→生产→成品→交付”全流程&#xff0c;各系统通过数据协同实现物料状态、位置、数量的精准追踪。以下按流转阶段拆解&#xff1a;一、需求发起与计划阶段&#xff08;CRM/ERP/PLM主导&#xff09;1. 需求源头…

Qt的安装和环境配置

QT开发环境的搭建&#xff0c;需要安装3个部分&#xff0c;C编译器、Qt SDK(SDK是软件开发工具包)、QT的集成开发环境(IDE)Qt的3种集成开发环境&#xff1a;Qt Creator&#xff1a;是由Qt官方提供的&#xff0c;容易上手&#xff0c;不需要额外的配置&#xff0c;但是有一些bug…

解析MCUboot的实现原理和Image结构

目录 概述 1 MCUboot的功能 1.1 代码包结构 1.2 限制 2 MCUboot Image 2.1 Image格式 2.2 Flash Map 2.3 Image 槽 2.4 使用scratch交换 2.5 Image 尾部数据结构 3 交换区 3.1 单交换区 3.2 Multiple Image boot 3.3 Image交换 4 交换状态&#xff08;swap statu…

YOLOv8目标检测项目代码详解与习题

YOLOv8目标检测项目代码详解与习题一、项目代码详解该代码是基于 YOLOv8 和 OpenCV 实现的图像目标检测项目&#xff0c;核心功能是加载预训练的 YOLOv8 模型&#xff0c;对指定图像进行目标检测&#xff0c;然后可视化检测结果并保存或显示。以下是逐行解析&#xff1a;# -*- …

gradle关于dependency-management的使用

1、相关文档Spring官方文档&#xff1a;https://docs.spring.io/dependency-management-plugin/docs/current-SNAPSHOT/reference/html/#introduction仓库版本查看&#xff1a;https://mvnrepository.com/artifact/io.spring.gradle/dependency-management-plugin/1.0.15.RELEA…

Java SpringBoot 对接FreeSwitch

1.增加Maven依赖<dependency><groupId>org.freeswitch.esl.client</groupId><artifactId>org.freeswitch.esl.client</artifactId><version>0.9.2</version></dependency><!-- XML-RPC --><dependency><groupI…

限流算法与实现

费曼学习法学习限流算法为什么要限流mysql插入600次/秒超过这个阈值&#xff0c;要么使用mysql集群、要么限流&#xff0c;防止宕机有哪些算法固定窗口就是个计数器&#xff0c;一秒内超过阈值&#xff0c;不允许访问缺点&#xff1a;不均匀&#xff0c;跨越临界点的一秒内&…

Android本地浏览PDF(Android PDF.js 简要学习手册)

环境 Min SDK: 21 依赖&#xff1a; implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1" implementation "androidx.webkit:webkit:1.12.0"权限&#xff1a; <uses-permission android:name"android.permission.INTERNE…