用Python解决优化问题_模拟退火模板

news2024/12/27 14:12:04

一、模拟退火算法简介

模拟退火(Simulated Annealing)是一种启发式算法,用于在优化问题中找到一个好的解。启发式是指一种用于找到解决问题方法的原则或策略,它不保证找到最优解,但可以快速找到一个足够好的解。在许多实际问题中,由于问题的复杂性,寻找最优解可能非常耗时或甚至不可能。启发式算法通过使用经验和直觉来简化问题或找到一个满意的解,而不是通过穷举所有可能的解决方案。

模拟退火流程图

启发式算法的特点:

  1. 快速性:启发式算法通常比寻找最优解的算法更快。
  2. 实用性:它们适用于那些寻找最优解过于复杂或不可能的问题。
  3. 足够好的解:启发式算法旨在找到一个“足够好”的解,而不是最优解。
  4. 依赖于经验:启发式策略通常基于经验和直觉。

应用领域:

  • 优化问题:如旅行商问题、装箱问题等。
  • 搜索问题:如迷宫求解、游戏AI等。
  • 数据挖掘:如特征选择、聚类分析等。

启发式算法是一种在解决复杂问题时非常有用的工具,它们通过使用经验法则和近似策略来快速找到满意的解,而不必追求最优解。这些算法在许多领域都有广泛的应用,尤其是在那些最优解难以计算或寻找的场合。

模拟退火算法的基本步骤:

  1. 初始化:随机选择一个解作为初始解,设定初始温度、温度下降速率(冷却率)和终止条件(如温度低于某个阈值或达到最大迭代次数)。
  2. 迭代:在当前温度下,随机扰动当前解,计算新解的适应度。
  3. 接受准则:根据Metropolis准则,以一定的概率接受新解。如果新解的适应度更好,则总是接受。如果新解的适应度更差,则以1减去新解的适应度差与当前温度的比值的指数函数的概率接受新解。
  4. 降温:降低温度,重复步骤2和3,直到满足终止条件。

Metropolis准则

温度的作用:

  • 在高温下,较大的温度T会使得上述指数函数的值较小,从而增加接受较差解的概率。
  • 在低温下,较小的温度T会使得上述指数函数的值较大,从而减小接受较差解的概率。

Metropolis准则是一种用于模拟退火算法中接受新解的策略。它基于概率来决定是否接受一个比当前解更差的解。这个准则的核心思想是在高温下允许接受较差的解,而在低温下则只接受更好的解。这样可以避免算法陷入局部最优解。

接下来举一个通过Python实现模拟退火的实例,假设我们要解决一个简单的优化问题,即寻找函数 f(x)=x^{2}的最小值。我们可以使用模拟退火算法来寻找这个函数的局部最小值。

二、用模拟退火算法求解函数的最小值

以下是用模拟退火算法求解函数 f(x)=x^{2}的最小值的示例模板:

import numpy as np
import math

def objective_function(x):
    return x**2

def simulated_annealing(objective, bounds, initial_temp, cooling_rate, max_iterations):
    current = np.random.uniform(*bounds)
    best = current
    best_score = objective(current)
    current_score = best_score
    
    temp = initial_temp
    for _ in range(max_iterations):
        for _ in range(100):  # 内循环迭代次数,可以调整
            # 随机扰动当前解
            new = current + np.random.normal(0, 0.1)
            new = np.clip(new, *bounds)  # 确保新解在边界内
            new_score = objective(new)
            
            # 接受新解的准则
            if new_score < current_score:
                current, current_score = new, new_score
                if new_score < best_score:
                    best, best_score = new, new_score
            elif math.exp(-(new_score - current_score) / temp) > np.random.rand():
                current, current_score = new, new_score
        
        # 降温
        temp *= cooling_rate
        
    return best, best_score

# 模拟退火参数
initial_temp = 1000
cooling_rate = 0.99
max_iterations = 10000
bounds = (-10, 10)  # 解的范围

# 执行模拟退火
best_solution, best_score = simulated_annealing(objective_function, bounds, initial_temp, cooling_rate, max_iterations)
best_solution, best_score

代码解释:

  1. 导入库

    • import numpy as np:用于数值计算。
    • import math:用于数学运算。
  2. 目标函数

    • def objective_function(x)::定义目标函数,这里是一个简单的二次函数。
  3. 模拟退火算法

    • def simulated_annealing(objective, bounds, initial_temp, cooling_rate, max_iterations)::定义模拟退火算法函数。
      • objective:目标函数。
      • bounds:解的范围,例如[-10, 10]。
      • initial_temp:初始温度。
      • cooling_rate:温度下降速率。
      • max_iterations:最大迭代次数。
    • current = np.random.uniform(*bounds):随机选择当前解。
    • best = current:初始化最佳解为当前解。
    • best_score = objective(current):计算当前解的目标函数值,并初始化最佳分数。
    • current_score = best_score:初始化当前分数为最佳分数。
    • temp = initial_temp:初始化温度。
    • for _ in range(max_iterations)::外循环,进行最大迭代次数的迭代。
      • for _ in range(100)::内循环,进行100次迭代。这可以调整,取决于问题的复杂性。
        • new = current + np.random.normal(0, 0.1):随机扰动当前解。
        • new = np.clip(new, *bounds):确保新解在边界内。
        • new_score = objective(new):计算新解的目标函数值。
        • if new_score < current_score::如果新解的分数更好,则接受新解。
          • 更新当前解和分数。
          • 如果新解的分数比最佳解更好,则更新最佳解和分数。
        • elif math.exp(-(new_score - current_score) / temp) > np.random.rand()::如果新解的分数更差,但满足Metropolis准则,则接受新解。更新当前解和分数。
        • temp *= cooling_rate:降温。
  4. 输出结果

    best_solution, best_score = simulated_annealing(objective_function, bounds, initial_temp, cooling_rate, max_iterations):执行模拟退火算法,并输出最佳解和最佳分数。

最后得到结果为,当在[-10,10]的取值范围内,当x接近于  1.77\times 10^{-8},对应的最小函数值约为 3.14\times 10^{-16}。但实际上最小值应该是0。

以上就是通过Python实现模拟退火的实例,这是一个简单的寻找函数 f(x)=x^{2}的最小值的优化问题,我们可以使用模拟退火算法来寻找这个函数的局部最小值。

点下关注,分享更多有关AI,数据分析和量化金融方面的实用教程和实战项目。

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

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

相关文章

资产全生命周期管理系统 固定资产全生命周期管理解决方案

什么是资产全生命周期管理系统 资产全生命周期管理系统是指对企业资产从采购、使用、维护、到报废的整个过程进行全方位管理的软件系统。通过这个系统&#xff0c;企业可以实现对资产的实时监控和管理&#xff0c;确保资产的利用率最大化。这个系统不仅能够跟踪资产的状态&…

C语言 数据存储

整形在内存中的存储&#xff08;之前的操作符讲过些许但不是很全&#xff0c;现在详细记录&#xff09; 对于一个整型变量来说&#xff0c;在内存中需要怎样存储&#xff1f; 之前了解到内存中存放的是补码&#xff08;正数的原反补都相同。回忆一下负数原码&#xff0c;反码…

IPD开发流程:项目风险画像

目录 1、内容简介 2、IPD 工具&#xff1a;项目风险画像 首先是独特性。 第二个是不确定性。 第三个是临时性。 第四个是跨职能性。 最后一个是变革性。 作者简介 1、内容简介 在 IPD 开发流程中&#xff0c; 经常会提到开发是一项投资行为、 产品/项目的商业价值等…

精细化管理和智慧化运营的智慧油站开源了

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用…

【数据分享】2018-2023年全国范围10米分辨率的耕地利用强度数据(免费获取)

耕地利用强度数据是评估农业生产力、规划土地使用、监测粮食安全与环境可持续性的关键&#xff0c;对政策制定和资源管理具有重要指导意义。然而&#xff0c;目前国家范围的耕地利用数据集在时空连续性、分辨率和精度方面存在局限性。 本次我们分享的是2018年至2023年分辨率为…

Rocky 8.10安装流程步骤详细教程

Rocky 8.10安装流程步骤详细教程 1. Rocky 8.10 安装2. 登录3. 配置修改3.1 打开命令行窗口3.2 网卡配置3.3 修改网卡名3.4 配置镜像源3.5 删除网卡多余内容3.5.1 删除virbr03.5.2 删除altname enp3s03.5.3 删除ipv63.5.4 修改ip地址(这步没有需要可以忽略) 3.6 升级openssh3.7…

【文献阅读】Lorentzian Linear Graph Convolutional Networks For Node Classification

Abstract 大多数现有的线性GCN模型在欧几里得空间中执行神经网络操作&#xff0c;并未明确捕捉到真实世界数据集中以图形式建模的树状层次结构。本文尝试将双曲空间引入线性GCN&#xff0c;并提出了一种新的洛伦兹线性GCN框架。 具体而言&#xff0c;将图节点的学习特征映射到…

函数作为返回值

复习闭包时注意到的 function lazy_sum(arr) {let sum function () {return arr.reduce(function (x, y) {return x y;});}return sum; }当我们调用lazy_sum()时&#xff0c;返回的并不是求和结果&#xff0c;而是求和函数&#xff1a; let f lazy_sum([1, 2, 3, 4, 5]); …

uniapp在线视频监控开发

我这里是uniapp开发的H5项目 视频流是flv模式 用到的插件是flv.js Flv.js Flv.js 是 HTML5 Flash 视频&#xff08;FLV&#xff09;播放器&#xff0c;纯原生 JavaScript 开发&#xff0c;没有用到 Flash。。由 bilibili 网站开源。 常见直播协议 RTMP: 底层基于TCP&…

【WebSocket】websocket学习【一】

1.消息推送常见方式 轮询长轮询SSEwebsocket 1.1. 轮询方式 轮询&#xff1a;浏览器以指定的时间间隔向服务器发出HTTP请求&#xff0c;服务器实时返回数据给浏览器长轮询&#xff1a;浏览器发出HTTP请求&#xff0c;服务器端接收到请求后&#xff0c;会阻塞请求直到有数据或…

[003].第4节:RabbitMQ环境搭建

我的后端学习大纲 RabbitMQ学习大纲 1.rpm包方式搭建&#xff1a; 1.1.搭建RabbitMQ单体架构&#xff1a; 1.MQ下载地址2.这里是提前下载好后上传安装包到服务器得opt目录下&#xff1a; 3.安装MQ需要先有Erlang语言环境&#xff0c;安装文件的Linux命令(分别按照以下顺序安装…

RabbitMQ发布订阅模式Publish/Subscribe详解

订阅模式Publish/Subscribe 基于API的方式1.使用AmqpAdmin定制消息发送组件2.消息发送者发送消息3.消息消费者接收消息 基于配置类的方式基于注解的方式总结 SpringBoot整合RabbitMQ中间件实现消息服务&#xff0c;主要围绕3个部分的工作进行展开&#xff1a;定制中间件、消息发…

网络硬盘录像机NVR程序源码NVR全套运用方案

在当今社会&#xff0c;随着科技的飞速发展和人们对安全需求的日益增长&#xff0c;安防监控系统已成为保障公共安全、维护社会稳定的重要手段。其中&#xff0c;网络视频录像机&#xff08;NVR&#xff09;作为安防监控系统的核心设备&#xff0c;其智能化升级运用方案对于提高…

OpenLayers3, 加载鹰眼控件

文章目录 一、前言二、代码实现三、总结 一、前言 鹰眼图即地图显示范围的缩略图&#xff0c;可显示当前地图窗口在整幅地图中的位置。通过拖动鹰眼图对话框中的矩形框可改变当前地图的显示区域范围&#xff0c;是地图浏览中常用的功能之一。 本案例使用OpenLayers3框架&…

数字虚拟人原理

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

振兴杯全国青年职业技能大赛信息通信网络线务员解决方案

一、引言 随着数字化时代的到来&#xff0c;信息技术的飞速发展正深刻改变着人们的生活与工作方式。智能楼宇作为这一时代的产物&#xff0c;以其提升生活和工作效率、改善居住和办公环境的特点&#xff0c;受到了广泛关注。智能安防作为智能楼宇的重要组成部分&#xff0c;其…

解决flutter运行项目后报错 java.util.zip.ZipException: zip END header not found

全新项目运行后直接报错 java.util.zip.ZipException: zip END header not found网上找了其他案例试了没有效果 根据官网说法&#xff0c;针对不同机型处理 我的是windows&#xff0c;然后按照图片说明的目录删除了文件夹之后重新运行项目了 注意.gradle文件夹是隐藏的&…

分析 Runtime.getRuntime() 执行阻塞原因

1、起因 线上系统通过 git 命令执行的方式获取远程仓库分支&#xff0c;一直运行正常的接口&#xff0c;突然出现超时&#xff0c;接口无法响应&#xff0c;分析验证发现只有个别仓库获取分支会出现这种情况&#xff0c;其他都还是可以正常获取到分支结果信息。 2、分析异常原…

音频分割怎么弄?手把手教会你实用的音频分割技巧

在巴黎的浪漫街头&#xff0c;打卡地标的方式已经达到了next level&#xff01;而今&#xff0c;想让这份记忆更加生动&#xff0c;不再只有照片与视频&#xff0c;更有音频的加入~ 想象一下&#xff0c;倘若用音频分割免费版工具来为这份旅行日志添上独一无二的音符&#xff…

Coze开发工作流

工作流可以理解是工作流程&#xff0c;就像流程审批的节点&#xff0c;它允许用户处理逻辑复杂且有较高稳定性要求的任务流。通过使用扣子提供的大量灵活可组合的节点&#xff0c;比如大语言模型 LLM、自定义代码、判断逻辑等&#xff0c;用户可以快速搭建工作流&#xff0c;无…