优化算法——模拟退火算法

article/2025/9/21 0:14:42

模拟退火算法原理

爬山法是一种贪婪的方法,对于一个优化问题,其大致图像(图像地址)如下图所示:
图片来自大白话解析模拟退火算法
其目标是要找到函数的最大值,若初始化时,初始点的位置在 C C C处,则会寻找到附近的局部最大值 A A A点处,由于 A A A点出是一个局部最大值点,故对于爬山法来讲,该算法无法跳出局部最大值点。若初始点选择在 D D D处,根据爬山法,则会找到全部最大值点 B B B。这一点也说明了这样基于贪婪的爬山法是否能够取得全局最优解与初始值的选取由很大的关系。

模拟退火算法(Simulated Annealing, SA)的思想借鉴于固体的退火原理,当固体的温度很高的时候,内能比较大,固体的内部粒子处于快速无序运动,当温度慢慢降低的过程中,固体的内能减小,粒子的慢慢趋于有序,最终,当固体处于常温时,内能达到最小,此时,粒子最为稳定。模拟退火算法便是基于这样的原理设计而成。

模拟退火算法从某一较高的温度出发,这个温度称为初始温度,伴随着温度参数的不断下降,算法中的解趋于稳定,但是,可能这样的稳定解是一个局部最优解,此时,模拟退火算法中会以一定的概率跳出这样的局部最优解,以寻找目标函数的全局最优解。如上图中所示,若此时寻找到了 A A A点处的解,模拟退火算法会以一定的概率跳出这个解,如跳到了 D D D点重新寻找,这样在一定程度上增加了寻找到全局最优解的可能性。

模拟退火算法

模拟退火算法过程

(1)随机挑选一个单元 k k k,并给它一个随机的位移,求出系统因此而产生的能量变化 Δ E k \Delta E_k ΔEk
(2)若 Δ E k ⩽ 0 \Delta E_k\leqslant 0 ΔEk0,该位移可采纳,而变化后的系统状态可作为下次变化的起点;
Δ E k > 0 \Delta E_k> 0 ΔEk>0,位移后的状态可采纳的概率为
P k = 1 1 + e − Δ E k / T P_k=\frac{1}{1+e^{-{\Delta E_k}/{T}}} Pk=1+eΔEk/T1
式中 T T T为温度,然后从 ( 0 , 1 ) \left ( 0,1 \right ) (0,1)区间均匀分布的随机数中挑选一个数 R R R,若 R < P k R< P_k R<Pk,则将变化后的状态作为下次的起点;否则,将变化前的状态作为下次的起点。
(3)转第(1)步继续执行,知道达到平衡状态为止。

模拟退火算法流程

这里写图片描述

模拟退火算法的Java实现

求解函数最小值问题:
F ( x ) = 6 x 7 + 8 x 6 + 7 x 3 + 5 x 2 − x y F\left ( x \right )=6x^7+8x^6+7x^3+5x^2-xy F(x)=6x7+8x6+7x3+5x2xy
其中, 0 ≤ x ≤ 100 0\leq x\leq 100 0x100,输入任意 y y y值,求 F ( x ) F\left ( x \right ) F(x)的最小值。

##Java代码

package sa;/*** 实现模拟退火算法* @author zzy*Email:zhaozhiyong1989@126.com*/
public class SATest {public static final int T = 100;// 初始化温度public static final double Tmin = 1e-8;// 温度的下界public static final int k = 100;// 迭代的次数public static final double delta = 0.98;// 温度的下降率public static double getX() {return Math.random() * 100;}/*** 求得函数的值* * @param x目标函数中的一个参数* @param y目标函数中的另一个参数* @return函数值*/public static double getFuncResult(double x, double y) {double result = 6 * Math.pow(x, 7) + 8 * Math.pow(x, 6) + 7* Math.pow(x, 3) + 5 * Math.pow(x, 2) - x * y;return result;}/*** 模拟退火算法的过程* @param y目标函数中的一个参数* @return最优解*/public static double getSA(double y) {double result = Double.MAX_VALUE;// 初始化最终的结果double t = T;double x[] = new double[k];// 初始化初始解for (int i = 0; i < k; i++) {x[i] = getX();}// 迭代的过程while (t > Tmin) {for (int i = 0; i < k; i++) {// 计算此时的函数结果double funTmp = getFuncResult(x[i], y);// 在邻域内产生新的解double x_new = x[i] + (Math.random() * 2 - 1) * t;// 判断新的x不能超出界if (x_new >= 0 && x_new <= 100) {double funTmp_new = getFuncResult(x_new, y);if (funTmp_new - funTmp < 0) {// 替换x[i] = x_new;} else {// 以概率替换double p = 1 / (1 + Math.exp(-(funTmp_new - funTmp) / T));if (Math.random() < p) {x[i] = x_new;}}}}t = t * delta;}for (int i = 0; i < k; i++) {result = Math.min(result, getFuncResult(x[i], y));}return result;}public static void main(String args[]) {// 设置y的值int y = 0;System.out.println("最优解为:" + getSA(y));}}

最后的结果

最优解为:1.733360963664572E-16



http://chatgpt.dhexx.cn/article/Bc5jSmcU.shtml

相关文章

模拟退火算法详细讲解(含实例python代码)

模拟退火算法详细讲解&#xff08;含实例python代码&#xff09; &#xff08;一&#xff09;模拟退火算法简介&#xff08;二&#xff09;模拟退火算法原理&#xff08;三&#xff09;退火过程中参数控制&#xff08;四&#xff09;算法步骤&#xff08;五&#xff09;实例分析…

模拟退火算法(SA)

一、算法简介 模拟退火算法(SA) 一种模拟物理退火过程而设计的优化算法 初始处于一个高温状态下&#xff0c;然后逐渐退火&#xff0c;在每个温度下慢慢冷却&#xff0c;最终达到物理基态&#xff08;相当于算法找到最优解&#xff09; 求解TSP问题(旅行商问题)、最值问题、全…

模拟退火算法(Simulated Annealing,SA)

这是一篇关于模拟退火算法的总结博客&#xff0c;包括算法思想&#xff0c;算法步骤&#xff0c;Python实现&#xff0c;MATLAB实现&#xff0c;算法进阶等。 目录 1 算法思想2 算法步骤3 SA解函数最小值&#xff08;python实现&#xff09;4 SA解旅行商问题&#xff08;MATLA…

退火算法(Annealing)简介与详解

模拟退火算法&#xff08;Simulated Annealing&#xff0c;SA&#xff09; 秒懂爬山算法&#xff08;Hill Climbing&#xff09;退火算法 详解算法来源数学推导来源&#xff1a;metropolis准则&#xff08;蒙特卡洛准则&#xff09; 算法流程算法优劣例题 秒懂 爬山算法&#…

Instrumentation框架分析及其使用

本文旨在从Android系统源码出发,简单梳理Instrumentation框架的行为及逻辑结构,供有兴趣的同学一起学习 从am instrument谈起 am instrument命令的执行 我们知道,命令行运行Android测试的命令是adb shell am instrument,这个命令是如何调起我们的测试代码来进行测试的呢,…

android.app.instrumentation解析

已经在Android SDK中学习了很多关于JUnit的内容&#xff0c;但是感觉一直有几个问题没有解决&#xff08;不知道大家是否有同样的感受&#xff09;JUnit的测试都自动化的&#xff0c;完全是不需要任何操作的&#xff0c;有2个问题我一直都还没有找到答案&#xff0c;这2个问题如…

Java探针 Instrumentation

背景&#xff1a;假如我们想打印出某些系统->某些类->某些方法的执行耗时&#xff0c;方式有很多&#xff0c;但是想要无侵入的做到这一点&#xff0c;只有Java探针一种方式。这也是很多调用链系统依赖的技术基础。 什么是Java探针 通俗来讲&#xff0c;就是Java提供的一…

opentelemetry-java-instrumentation翻译

原文地址&#xff1a;原文 OpenTelemetry Instrumentation for Java 这个项目提供了一个Java agent JAR&#xff0c;这个jar可以attached to任何Java8的应用上&#xff0c;动态地注入&#xff08;inject&#xff09;字节码从大量的流行库和框架&#xff08;popular libraries …

Instrument

使用Instruments 里面的Automation&#xff0c;可以对iOS进行自动化测试。 参考这篇文章&#xff1a;http://www.codeproject.com/KB/iPhone/UI_Automation_Testing.aspx 我用的是xcode4.2。 在这里下载修改好的项目&#xff0c;xcode4.2下用的&#xff1a;http://download.csd…

android Instrumentation

Android提供了一系列强大的测试工具&#xff0c;它针对Android的环境&#xff0c;扩展了业内标准的JUnit测试框架。尽管你可以使用JUnit测试Android工程&#xff0c;但Android工具允许你为应用程序的各个方面进行更为复杂的测试&#xff0c;包括单元层面及框架层面。 Android测…

Instrumentation 应用简介

引用&#xff1a; java-instrumentation 引用&#xff1a;Instrumentation 新功能 简介 java Instrumentation指的是可以用独立于应用程序之外的代理&#xff08;agent&#xff09;程序来监测和协助运行在JVM上的应用程序。这种监测和协助包括但不限于获取JVM运行时状态&#…

AndroidStudio单元测试——instrumentation

前言&#xff1a;这几天老大要我搞代码自动测试&#xff0c;eclispe的已经解决了&#xff0c;可他们都是用android studio&#xff0c;所以要在android studio 上重新试验&#xff0c;这个有难度啊&#xff0c;android studio国内资料极少&#xff0c;更不要说单元测试了。goog…

Android Instrumentation 简介

Instrumentation 简介 APIs && Source code 官方APIs地址(需要翻墙)Source code Instrumentation 特点 该框架基于JUnit&#xff0c;因此既可以直接使用Junit 进行测试&#xff0c;也可以使用Instrumentation 来测试Android 组件其为Android 应用的每种组件提供了测…

冲突域和广播域?

如何理解冲突域和广播域&#xff1f; 冲突域&#xff1a; 【定义】在同一个冲突域中的每一个节点都能收到所有被发送的帧。简单的说就是同一时间内只能有一台设备发送信息的范围。 【分层】基于OSI的第一层物理层 【设备】第二层设备能隔离冲突域&#xff0c;比如Switch。交…

广播域与冲突域

广播域与冲突域 一个集线器&#xff08;中继器&#xff09;连接的网络成为冲突域&#xff0c;因为每台主机都连接在了同一条线路上&#xff0c;所以传送信息时会冲突。 冲突域是基于第一层(物理层) 而交换机的本质是一个多借口网桥&#xff0c;就是说由交换机组成的网络中&…

冲突域广播域

网络互连设备可以将网络划分为不同的冲突域、广播域。但是&#xff0c;由于不同的网络互连设备可能工作在OSI模型的不同层次上。因此&#xff0c;它们划分冲突域、广播域的效果也就各不相同。如中继器工作在物理层&#xff0c;网桥和交换机工作在数据链路层&#xff0c;路由器工…

广播域和冲突域问题

该图中有几个冲突域几个广播域&#xff1f; 解答&#xff1a; 1、两个广播域&#xff0c;七个冲突域。 这样的&#xff1a;集线器属于物理层&#xff0c;所有接口同属于一个冲突域、一个广播域&#xff1b;交换机属于数据链路层&#xff0c;每个接口是一个单独的冲突域…

冲突域和碰撞域的理解

如何理解冲突域和广播域&#xff1f; 转载 冲突域&#xff1a; 【定义】在同一个冲突域中的每一个节点都能收到所有被发送的帧。简单的说就是同一时间内只能有一台设备发送信息的范围。 【分层】基于OSI的第一层物理层 【设备】第二层设备能隔离冲突域&#xff0c;比如Swi…

如何计算冲突域和广播域-图解分析

如何理解冲突域和广播域?冲突域:【定义】在同一个冲突域中的每一个节点都能收到所有被发送的帧。简单的说就是同一时间内只能有一台设备发送信息的范围。【分层】基于OSI的第一层(数据链路层)物理层【设备】第二层设备能隔离冲突域,比如Switch。交换机能缩小冲突域的范围,交…

有关冲突域的定义

一开始学习网络的时候&#xff0c;对于冲突域和广播域的理解仅仅是从设备上进行理解的&#xff0c;即集线器是一个冲突域&#xff0c;交换机能够分离冲突域&#xff0c;不能够分离广播域&#xff0c;路由器可以分离组播域。至于冲突域到底是什么&#xff0c;怎么样定义的&#…