2.算法-Python模拟退火算法实例

news2024/11/20 4:51:04

题记 

        下面是python编写的模拟退火算法实例,包括全过程和解析。

编写main.py文件

         main.py文件如下:

import math
import random

# 初始解:算法从问题的解空间中随机选择一个初始解作为当前解。
# 目标函数:算法需要优化的目标函数定义了解的质量。算法的目标是最小化或最大化这个函数。
# 温度:模拟退火算法引入了一个控制搜索过程的温度参数。温度高时,算法更容易接受比当前解质量差的解;温度逐渐降低,接受劣质解的概率也逐渐减小。
# 邻域操作:算法通过在当前解的邻域中进行随机扰动来生成新的解。邻域操作的设计通常依赖于具体问题。
# 能量差:新解和当前解之间的目标函数值差异被称为能量差。如果新解更优(即目标函数值更小或更大,取决于问题类型),则新解被接受。如果新解劣于当前解,有一定概率接受新解,这个概率由温度和能量差共同决定。
# 降温策略:温度随着迭代逐渐降低,冷却过程的速率由降温策略(通常是指数衰减)决定。随着温度的降低,算法在接受劣质解的概率减小,搜索逐渐趋向于收敛。
# 停止准则:算法根据一定的停止准则(例如达到最大迭代次数、温度降低到某个阈值等)确定何时停止搜索并返回当前解作为最终结果。

# 目标函数(这里以一个简单的二次函数为例)
def objective_function(x):
    return x**2

# 模拟退火算法,主体
def simulated_annealing(max_iterations, initial_temperature, cooling_rate):
    # 选择初始解,从-10,10
    current_solution = random.uniform(-10, 10)
    # 初始解的目标函数值,作为当前解的能量
    current_energy = objective_function(current_solution)
    # 这个循环用于迭代模拟退火算法,参数为迭代次数
    for i in range(max_iterations):
        # 计算当前温度,温度随着迭代逐渐降低,由初始温度initial_temperature按照指数衰减(以cooling_rate为衰减率)。
        temperature = initial_temperature * math.exp(-cooling_rate * i)

        # 生成新解,通过在当前解的基础上加上一个[-1, 1]范围内的随机数
        new_solution = current_solution + random.uniform(-1, 1)
        new_energy = objective_function(new_solution)

        # 计算能量差
        energy_difference = new_energy - current_energy

        # 如果新解更优或者以一定概率接受劣解,这是模拟退火算法的关键部分,允许算法在一定程度上接受劣质解,以避免陷入局部最优解,e的x次方
        # 从[0.0,1.0)
        if energy_difference < 0 or random.random() < math.exp(-energy_difference / temperature):
            #更新解和能量
            current_solution = new_solution
            current_energy = new_energy

    return current_solution, current_energy

# 参数设置
max_iterations = 10000  # 迭代次数
initial_temperature = 100  # 初始温度
cooling_rate = 0.01  # 降温速率

# 运行模拟退火算法
best_solution, best_energy = simulated_annealing(max_iterations, initial_temperature, cooling_rate)

print("最优解:", best_solution)
print("最优解的目标函数值:", best_energy)
import math
import random

# 初始解:算法从问题的解空间中随机选择一个初始解作为当前解。
# 目标函数:算法需要优化的目标函数定义了解的质量。算法的目标是最小化或最大化这个函数。
# 温度:模拟退火算法引入了一个控制搜索过程的温度参数。温度高时,算法更容易接受比当前解质量差的解;温度逐渐降低,接受劣质解的概率也逐渐减小。
# 邻域操作:算法通过在当前解的邻域中进行随机扰动来生成新的解。邻域操作的设计通常依赖于具体问题。
# 能量差:新解和当前解之间的目标函数值差异被称为能量差。如果新解更优(即目标函数值更小或更大,取决于问题类型),则新解被接受。如果新解劣于当前解,有一定概率接受新解,这个概率由温度和能量差共同决定。
# 降温策略:温度随着迭代逐渐降低,冷却过程的速率由降温策略(通常是指数衰减)决定。随着温度的降低,算法在接受劣质解的概率减小,搜索逐渐趋向于收敛。
# 停止准则:算法根据一定的停止准则(例如达到最大迭代次数、温度降低到某个阈值等)确定何时停止搜索并返回当前解作为最终结果。

# 目标函数(这里以一个简单的二次函数为例)
def objective_function(x):
    return x**2

# 模拟退火算法,主体
def simulated_annealing(max_iterations, initial_temperature, cooling_rate):
    # 选择初始解,从-10,10
    current_solution = random.uniform(-10, 10)
    # 初始解的目标函数值,作为当前解的能量
    current_energy = objective_function(current_solution)
    # 这个循环用于迭代模拟退火算法,参数为迭代次数
    for i in range(max_iterations):
        # 计算当前温度,温度随着迭代逐渐降低,由初始温度initial_temperature按照指数衰减(以cooling_rate为衰减率)。
        temperature = initial_temperature * math.exp(-cooling_rate * i)

        # 生成新解,通过在当前解的基础上加上一个[-1, 1]范围内的随机数
        new_solution = current_solution + random.uniform(-1, 1)
        new_energy = objective_function(new_solution)

        # 计算能量差
        energy_difference = new_energy - current_energy

        # 如果新解更优或者以一定概率接受劣解,这是模拟退火算法的关键部分,允许算法在一定程度上接受劣质解,以避免陷入局部最优解,e的x次方
        # 从[0.0,1.0)
        if energy_difference < 0 or random.random() < math.exp(-energy_difference / temperature):
            #更新解和能量
            current_solution = new_solution
            current_energy = new_energy

    return current_solution, current_energy

# 参数设置
max_iterations = 10000  # 迭代次数
initial_temperature = 100  # 初始温度
cooling_rate = 0.01  # 降温速率

# 运行模拟退火算法
best_solution, best_energy = simulated_annealing(max_iterations, initial_temperature, cooling_rate)

print("最优解:", best_solution)
print("最优解的目标函数值:", best_energy)

执行程序 

         python main.py

展示图 

后记

        觉得有用可以点赞或收藏!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1094848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Docker】Docker的使用案例以及未来发展、Docker Hub 服务、环境安全、容器部署安全

作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

【算法学习】-【滑动窗口】-【将 x 减到 0 的最小操作数】

LeetCode原题链接&#xff1a;1658. 将 x 减到 0 的最小操作数 下面是题目描述&#xff1a; 给你一个整数数组 nums 和一个整数 x 。每一次操作时&#xff0c;你应当移除数组 nums 最左边或最右边的元素&#xff0c;然后从 x 中减去该元素的值。请注意&#xff0c;需要 修改 数…

通过示例详细了解ES6导入导出模块

通过示例详细了解ES6导入导出模块 似乎许多开发人员认为 ES6 模块只不过是export、import关键字。事实上&#xff0c;它更加多样化。它拥有强大的功能和鲜为人知的问题。在本文中&#xff0c;我们将使用一些示例来了解这些内容。 示例一 // index.mjs import { default } fr…

【STL】容器适配器stack和queue常见用法及模拟实现

目录 1.stack介绍及使用1.1 stack的介绍1.2 stack使用 2. stack模拟实现3. queue介绍及使用3.1 queue的介绍4. queue模拟实现 5. 栈和队列使用不同默认适配器的区别6. dequeue原理简单介绍6.1 dequeue底层实现6.2 dequeue的缺点 1.stack介绍及使用 1.1 stack的介绍 stack文档介…

每天debug/run一键启动的Spring Boot控制台启动日志,你了解过吗?

文章目录 前言JDK执行Spring Boot应用的启动命令Spring Boot本身启动时的日志总结 前言 每次打开Idea点击debug/run启动SpringBoot项目时&#xff0c;都在坐等启动成功的最后一行日志&#xff0c;然而对于启动过程中&#xff0c;控制台里面的每一行日志代表什么&#xff1f;你…

论文学习——FALL-E:GAUDIO FOLEY SYNTHESIS SYSTEM

文章目录 引言正文AbstractIntroduction介绍问题 FALL-E2.1 Architexture结构2.2 Training and Inference Details 3 Evaluation And Analysis测试和分析Conlusion 总结 引言 这篇文章是DCASE中少有的&#xff0c;没有使用DIffusion的方法&#xff0c;可以学习一下。这篇文章的…

『C++之STL』双端队列 - deque

前言 双端队列,Double-ended queue,简称为deque是一种线性结构的一种容器; 在数据结构中出现的顺序表与链表,或者栈与队列都算是线性结构; 在结构中,它与vector相比较会相似一些; 但是在实际当中,双端队列 - deque 包含了vector与list的优点; vector(顺序表) 支持随机访问,空…

cuda12+vs2019环境搭建 发疯实录

点击exe文件后开始安装&#xff08;注意更改默认安装的位置&#xff09; 在选项阶段&#xff0c;全选所有的选项 出现的问题&#xff0c;这里显示未安装 进一步地查看原因 可能式对应的版本下载错误 如何寻找到所需要的版本并进行下载&#xff1f; 在上述参考链接中进行搜…

阿里云韩国服务器测试IP地址及公网带宽收费价格表

阿里云服务器韩国&#xff08;首尔&#xff09;地域公网带宽价格表&#xff0c;1M带宽价格是23.0元/月&#xff0c;按使用流量1GB价格是0.8元&#xff0c;阿里云韩国服务器测试IP地址&#xff1a;149.129.12.20&#xff0c;阿里云百科aliyunbaike.com来详细说下阿里云韩国服务器…

mybatis用拦截器实现字段加解密

前言 根据公司业务需要&#xff0c;灵活对客户敏感信息进行加解密&#xff0c;这里采用mybatis拦截器进行简单实现个demo。 拦截器的使用 // 执行 Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) // 请求参数处理 Paramete…

基于蛾群优化的BP神经网络(分类应用) - 附代码

基于蛾群优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于蛾群优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.蛾群优化BP神经网络3.1 BP神经网络参数设置3.2 蛾群算法应用 4.测试结果&#xff1a;5.M…

常用的数字格式代码

文章目录 数值占位符文本占位符 两类占位符: 数值占位符, 文本占位符. 数值占位符 有三种&#xff1a;0&#xff0c;#&#xff0c;&#xff1f; 0 是强制的占位符。 文本占位符 文本占位符只有一个&#xff1a; : 作用于文本的占位符&#xff0c;可以用英文引号" &quo…

DirectX绘制流水线

使用DirectX可以让在Windows平台上运行的游戏或多媒体程序获得更高的执行效率&#xff0c;掌握DirectX的基本概念和技术是虚拟现实技术、计算机仿真和3D游戏程序开发的基础。 DirectX概述 DirectX是微软的一个多媒体应用编程接口(API)工具包&#xff0c;用于为Windows操作系统…

Qt QMovie和QLabel配合播放GIF表情包

文章目录 效果演示main函数创建MoviePlayer对象头文件movieplayer.h源文件movieplayer.cpp代码解释在Qt框架中,QMovie是用于处理动画和视频的类。所有源码已在本篇文章公布。 效果演示 main函数创建MoviePlayer对象 #include <QApplication>#include "movie

JAVAEE初阶相关内容第十三弹--文件操作 IO

写在前 终于完成了&#xff01;&#xff01;&#xff01;&#xff01;内容不多就是本人太拖拉&#xff01; 这里主要介绍文件input&#xff0c;output操作。File类&#xff0c;流对象&#xff08;分为字节流、字符流&#xff09; 需要掌握每个流对象的使用方式&#xff1a;打…

MySQL jdbc,事务,连接池

​​​ 3-MySQL jdbc,事务,连接 1 jdbc 1.1 jdbc概述# JDBC&#xff08;Java DataBase Connectivity,java数据库连接技术&#xff09;是一种用于执行SQL语句的Java API。 JDBC是Java访问数据库的标准规范&#xff0c;可以为不同的关系型数据库提供统一访问&#xff0c;它由一…

php对接微信支付简要流程?面试时你会描述吗?

一、微信支付申请&#xff1a;微信公众号平台-->功能中找到微信支付-->申请接入 1.如果没有微信支付商会号&#xff0c;需要进行申请 提交营业执照、身份证、银行账户 2.如果有微信支付商会号 可进行直接关联 登录微信商户平台—产品中心—APPID授权管理—新增授权申…

视频编辑软件 Premiere Pro 2024 macv24.0中文版 (pr2024)

Premiere Pro 2024 mac编辑任何现代格式的素材&#xff0c;从8K到虚拟现实。广泛的原生文件支持和简单的代理工作流程可以轻松使用您的媒体&#xff0c;即使在移动工作站上也是如此。提供针对任何屏幕或平台优化的内容比以往任何时候都快。 Premiere Pro 2024 Mac版软件介绍 视…

深度强化学习 第 2 章 蒙特卡洛

2.1随机变量 强化学习中会经常用到两个概念&#xff1a; 随机变量、 观测值。 本书用大写字母表示随机变量&#xff0c;小写字母表示观测值&#xff0c;避免造成混淆。 下面我们定义概率质量函数&#xff08;probability mass function&#xff0c;缩写 PMF&#xff09;和概率…

SpringBoot面试题5:SpringBoot Starter的工作原理是什么?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:SpringBoot Starter的工作原理是什么? Spring Boot Starter 是一种便捷的方式来为 Spring Boot 应用程序引入一组特定功能的依赖项。它简化了项目…