scikit-opt几种数值模拟退火的代码示例,和参数详解,以及基础模拟退火的原理代码示例

news2024/9/21 16:20:31
python基础模拟退火原理示例

模拟退火的特性决定了一般可以用于算法的调参,相比较遗传算法来说,普遍更快一些,但是也更容易陷入局部最优。相对来说,遗传算法的更新解机制是在最每一个局部最优解附近盘旋游荡,则更容易达到全局最优,但是计算量则更大。

# -*- encoding: utf-8 -*-
'''
@File    :   simulate_anneal.py
@Time    :   2020/10/28 12:45:28
@Author  :   DataMagician 
@Version :   1.0
@Contact :   408903228@qq.com
'''

# here put the import lib

import numpy as np
import matplotlib.pyplot as plt


# ### $ 根据热力学的原理,在温度为T时,出现能量差为dE的降温的概率为P(dE),表示为:$
# # $ P(dE) = exp( dE/(k*T) ) $
# ### $ 其中k是一个常数,exp表示自然指数,且dE<0(温度总是降低的)。这条公式指明了 $


# # 单变量退火
def PDE(DE, T, k=1):
    '''

    Args:
        DE:
        t:
        k:

    Returns:

    '''
    return np.exp((DE) / (k * T))


def DE_function(new, old):
    '''

    Args:
        new:
        old:

    Returns:

    '''
    return new - old


def jump(DE, T, k=1):
    '''

    Args:
        DE:
        T:
        k:

    Returns:

    '''
    return PDE(DE, T, k) > np.random.rand() and 0 or 1


def simulate_anneal(func,
                    parameter={
                        "T": 1, #系统的温度,系统初始应该要处于一个高温的状态 初始温度越高,且马尔科夫链越长,算法搜索越充分,得到全局最优解的可能性越大,但这也意味着需要耗费更多的计算时间
                        "T_min": 0, #温度的下限,若温度T达到T_min,则停止搜索
                        "r": 0.0001, #用于控制降温的快慢 值越小T更新越快,退出越快
                        "expr": 0, #初始解
                        "jump_max": np.inf,#最大回炉停留次数
                        "k":1 # k越小越不容易退出
                    }):
    '''

    Args:
        func:
        parameter:

    Returns:

    '''
    
    path, funcpath = [], []
    T = parameter["T"]  # 系统温度,初时应在高温
    T_min = parameter["T_min"]  # 最小温度值
    r = parameter["r"]  # 降温速率
    counter = 0
    expr = parameter["expr"]  # 假设初解
    jump_max = parameter["jump_max"]  # 最大冷却值
    jump_counter = 0
    k = parameter["k"]
    while T > T_min:
        counter += 1
        new_expr = func.__next__()  # 迭代新解
        funcpath.append(new_expr)
        DE = DE_function(new_expr , expr)
        if DE <= 0:
            # 如果新解比假设初解或者上一个达标解要小,就更新解
            expr = new_expr
            # 跳出域值更新为0 
            jump_counter = 0
        elif DE > 0:
            # 如果新解比假设初解或者上一个达标解要大,就不更新解
            expr = expr
            if jump(DE, T,k):
                # 每更新一次T更新一次
                T *= r
                jump_counter += 1
                if jump_counter > jump_max:
                    print("最大回炉冷却次数:", jump_counter)
                    return expr, path, funcpath
        path.append(expr)
        print("{}{}{}{}{}{}{}{}".format('系统温度:', T, ' 新状态:', expr, ' 迭代轮次:',
                                        counter, ' DE:', DE))

    return expr, path, funcpath


if __name__ == "__main__":

    def f():  # 待优化最小函数
        '''

        Returns:

        '''
        for x in np.random.randn(1000):
            yield x

    expr, path, funcpath = simulate_anneal(f(),
                                           parameter={
                                               "T": 1,
                                               "T_min": 0,
                                               "r": 0.4,
                                               "expr": 0,
                                               "jump_max": 1000,
                                               "k":0.000001
                                           })
    print(expr)
    plt.figure(figsize=(16, 9))  # %%
    plt.plot(path, c='g')
    plt.plot(funcpath, c='r')
    plt.show()
    plt.close()

请添加图片描述

快速模拟退火
from sko.SA import SAFast
import matplotlib.pyplot as plt
import pandas as pd

def demo_func(x):
    return x[0] ** 2 + (x[1] - 0.05) ** 2 + x[2] ** 2

sa = SAFast(func=demo_func
        , x0=[1, 1, 1] # 初始x解,初始解越大则越难到达最小值,越小则越容易错过
        , T_max=1 #系统的温度,系统初始应该要处于一个高温的状态 初始温度越高,且马尔科夫链越长,算法搜索越充分,得到全局最优解的可能性越大,但这也意味着需要耗费更多的计算时间
        , T_min=1e-9  #温度的下限,若温度T达到T_min,则停止搜索
        , L=300 #最大迭代次数,每个温度下的迭代次数(又称链长)
        , max_stay_counter=100 # 最大冷却停留计数器,保证快速退出,如果 best_y 在最大停留计数器次数(也称冷却时间)内保持不变,则停止运行
        ,lb = [-1,1,-1] #x的下限
        ,ub = [2,3,4] #x的上限
        #,hop = [3,2,1] # x 的上下限最大差值 hop=ub-lb 
        ,m = 1 # 0-正无穷,越大,越容易冷却退出
        ,n = 1 # # 0-正无穷,越大,越不容易冷却退出
        ,quench = 1 # 淬火指数,0-正无穷,越小则越慢,但是越能求出最小,越大则越快,但是容易陷入局部最优
       )
best_x, best_y = sa.run()
print('best_x:', best_x, 'best_y:', best_y,"y_history:",len(sa.best_y_history),sa.iter_cycle)
plt.plot(pd.DataFrame(sa.best_y_history).cummin(axis=0))
plt.show()

请添加图片描述

纯数值模拟退火
from sko.SA import SimulatedAnnealingValue
import matplotlib.pyplot as plt
import pandas as pd

def demo_func(x):
    return x[0] ** 2 + (x[1] - 0.05) ** 2 + x[2] ** 2
    
sa = SimulatedAnnealingValue(func=demo_func
        , x0=[1, 1, 1] # 初始x解,初始解越大则越难到达最小值,越小则越容易错过
        , T_max=1 #系统的温度,系统初始应该要处于一个高温的状态 初始温度越高,且马尔科夫链越长,算法搜索越充分,得到全局最优解的可能性越大,但这也意味着需要耗费更多的计算时间
        , T_min=1e-9  #温度的下限,若温度T达到T_min,则停止搜索
        , L=300 #最大迭代次数,每个温度下的迭代次数(又称链长)
        , max_stay_counter=100000 # 冷却停留计数器,如果 best_y 在最大停留计数器次数(也称冷却时间)内保持不变,则停止运行
        ,lb = [-1,1,-1] #x的下限
        ,ub = [2,3,4] #x的上限
        #,hop = [3,2,1] # x 的上下限最大差值 hop=ub-lb 
        ,learn_rate = 0.0001 # 学习率,用于控制降温的快慢 值越小T更新越快,退出越快
       )
best_x, best_y = sa.run()
print('best_x:', best_x, 'best_y:', best_y,"y_history:",len(sa.best_y_history))
plt.plot(pd.DataFrame(sa.best_y_history).cummin(axis=0))
plt.show()

请添加图片描述

柯西模拟退火
from sko.SA import SACauchy
import matplotlib.pyplot as plt
import pandas as pd

def demo_func(x):
    return x[0] ** 2 + (x[1] - 0.05) ** 2 + x[2] ** 2
    
sa = SACauchy(func=demo_func
        , x0=[1, 1, 1] # 初始x解,初始解越大则越难到达最小值,越小则越容易错过
        , T_max=1 #系统的温度,系统初始应该要处于一个高温的状态 初始温度越高,且马尔科夫链越长,算法搜索越充分,得到全局最优解的可能性越大,但这也意味着需要耗费更多的计算时间
        , T_min=1e-9  #温度的下限,若温度T达到T_min,则停止搜索
        , L=300 #最大迭代次数,每个温度下的迭代次数(又称链长)
        , max_stay_counter=100 # 冷却停留计数器,如果 best_y 在最大停留计数器次数(也称冷却时间)内保持不变,则停止运行
        ,lb = [-1,1,-1] #x的下限
        ,ub = [2,3,4] #x的上限
        #,hop = [3,2,1] # x 的上下限最大差值 hop=ub-lb 
        ,learn_rate = 0.1 # 学习率,用于控制降温的快慢 值越大T更新越快,退出越快
       )
best_x, best_y = sa.run()
print('best_x:', best_x, 'best_y:', best_y,"y_history:",len(sa.best_y_history))
plt.plot(pd.DataFrame(sa.best_y_history).cummin(axis=0))
plt.show()

请添加图片描述

玻尔兹曼模拟退火
from sko.SA import SABoltzmann
import matplotlib.pyplot as plt
import pandas as pd

def demo_func(x):
    return x[0] ** 2 + (x[1] - 0.05) ** 2 + x[2] ** 2
    
sa = SABoltzmann(func=demo_func
        , x0=[1, 1, 1] # 初始x解,初始解越大则越难到达最小值,越小则越容易错过
        , T_max=1 #系统的温度,系统初始应该要处于一个高温的状态 初始温度越高,且马尔科夫链越长,算法搜索越充分,得到全局最优解的可能性越大,但这也意味着需要耗费更多的计算时间
        , T_min=1e-9  #温度的下限,若温度T达到T_min,则停止搜索
        , L=300 #最大迭代次数,每个温度下的迭代次数(又称链长)
        , max_stay_counter=100 # 冷却停留计数器,如果 best_y 在最大停留计数器次数(也称冷却时间)内保持不变,则停止运行
        # ,lb = [-1,1,-1] #x的下限
        # ,ub = [2,3,4] #x的上限
        ,hop = [3,2,1] # x 的上下限最大差值 hop=ub-lb 
        ,learn_rate = 0.1 # 学习率,用于控制降温的快慢 值越大T更新越快,退出越快
       )
best_x, best_y = sa.run()
print('best_x:', best_x, 'best_y:', best_y,"y_history:",len(sa.best_y_history))
plt.plot(pd.DataFrame(sa.best_y_history).cummin(axis=0))
plt.show()

请添加图片描述

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

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

相关文章

View绘制

onDraw 绘制 canvas 画布 paint 画笔 坐标系 x y x 0 y 0 则屏幕左上角 y从上往下值增加 像素转换 dp2px 画线line drawLine 圆circle drawCircle drawPath: 在onSizeChanged 时候初始化 addCircle 添加圆 CW顺时针 CCW 逆时针 CW CCW填充规则不同 填充规则: 默认 …

NX二次开发UF_MTX2_vec_multiply_t 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_MTX2_vec_multiply_t Defined in: uf_mtx.h void UF_MTX2_vec_multiply_t(const double vec [ 2 ] , const double mtx [ 4 ] , double vec_product [ 2 ] ) overview 概述 Ret…

邮政快递物流查询,将指定某天签收的单号筛选出来

批量查询邮政快递单号的物流信息&#xff0c;将指定某天签收的单号筛选出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 邮政快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;并登录 步骤2&#xff1a;点击主界面左…

python-nmap库使用教程(Nmap网络扫描器的Python接口)(功能:主机发现、端口扫描、操作系统识别等)

文章目录 Python-nmap库使用教程前置条件引入python-nmap创建Nmap扫描实例执行简单的主机发现&#xff08;nmap -sn&#xff09;示例&#xff0c;我有一台主机配置为不响应 ICMP 请求&#xff0c;但使用nmap -sn&#xff0c;仍然能够探测到设备&#xff1a; 端口扫描扫描特定端…

线性回归 调试方法

调试方法 特征缩放 对于某些不具有比较性的样本特征 x i x_i xi​ &#xff08;比如对其他的x来说 x i x_i xi​ 相当大或者相当小&#xff09;&#xff0c;梯度下降的过程可能会非常漫长&#xff0c;并且可能来回波动才能最后收敛到全局的最小值。 在这样的情况下&#xff…

SAP BW层级结构小结属性数据源+专家例程实现层级结构增强加载

作者 idan lian 如需转载备注出处 BW信息对象-层级结构 RSH1 维护信息对象层级 这里的文本描述对应T表中的描述&#xff0c;文本数据源加载之后有数据 信息对象层级H表 以上描述都是根据自我理解翻译的&#xff0c;非官方翻译 层级标识&#xff1a;自动生成&#xff0c;其实…

CCF CSP认证 历年题目自练Day50

题目 试题编号&#xff1a; 201809-3 试题名称&#xff1a; 元素选择器 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 题目分析&#xff08;个人理解&#xff09; 还是先理解题意&#xff0c;关于html的部分&#xff0c;可以按照样例画出…

2000-2021年各省人口密度数据

2000-2021年各省人口密度数据 1、时间&#xff1a;2000-2021年 2、指标&#xff1a;地区、年份、年末常住总人口(万人&#xff09;、面积&#xff08;平方千米&#xff09;、人口密度&#xff08;人/平方千米&#xff09; 3、来源&#xff1a;各省年鉴、统计年鉴、各省统计局…

Redis面试题-缓存穿透,缓存击穿和缓存雪崩

目录 缓存穿透 面试官&#xff1a;什么是缓存穿透 ? 怎么解决 ? 面试官&#xff1a;你能介绍一下布隆过滤器吗&#xff1f; 缓存击穿 面试官&#xff1a;什么是缓存击穿 ? 怎么解决 ? 缓存雪崩 面试官&#xff1a;什么是缓存雪崩 ? 怎么解决 ? 缓存穿透 面试官&a…

笔记二十六、React中路由懒加载的扩展使用

26.1 在路由中配置懒加载 lazy routes/index.jsx 代码 import {Navigate} from "react-router-dom"; import Home from "../components/Home"; import About from "../components/About"; // import Classify from "../components/Home/c…

Vue3 刷新后,pinia存储的数据丢失怎么解决

这个问题有两种解决办法&#xff1a; 一是使用pinia的持久化存储一是使用vue的依赖注入 刷新后&#xff0c;通过pinia存储的vue store数据丢失&#xff0c;实际上是因为Vue原组件卸载、新组件重新挂载导致的&#xff0c;vue store是挂载在组件上的&#xff0c;当刷新导致组件…

处理机调度与作业调度

处理机调度 一个批处理型作业&#xff0c;从进入系统并驻留在外存的后备队列上开始&#xff0c;直至作业运行完毕&#xff0c;可能要经历如下的三级调度 高级调度 也称为作业调度、长程调度、接纳调度。调度对象是作业 主要功能&#xff1a; 挑选若干作业进入内存 为作业创建…

使用RobotFramework编写BDD代码

背景 行为驱动开发&#xff08;Behavior Driven Development&#xff09;即BDD&#xff0c;是一种敏捷开发方法&#xff0c;通常应用在自动化测试中&#xff0c;或者也可称为行为驱动测试。通过使用自然描述语言确定自动化脚本&#xff0c;通过这种方式&#xff0c;能够大大促…

微调Fine tune

网络架构 一个神经网络一般可以分为两块 特征抽取将原始像素变成容易线性分割的特征线性分类器来做分类 微调&#xff1a;使用之前已经训练好的特征抽取模块来直接使用到现有模型上&#xff0c;而对于线性分类器由于标号可能发生改变而不能直接使用 训练 是一个目标数据集上…

RS232串口_笔记

这里写目录标题 1、RS232串口理论起始位数据位校验位LSB & MSB示波器查看数据信号对应连接方式 1、RS232串口理论 UART(通用异步收发传输) 是一种通信协议&#xff0c;而 RS232 (串行通信接口)是种物理接口标准。UART 是一种用于在计算机和外部设备之间传输数据的协议&…

Mac电脑版程序创建工具 VMware InstallBuilder Enterprise mac最新

VMware InstallBuilder Enterprise 是一款功能强大、操作简单、跨平台支持的软件安装和部署工具&#xff0c;可以让开发者更加高效地创建和部署软件&#xff0c;并提供了丰富的功能和工具&#xff0c;适用于不同的用户需求和场景。 内置调试器 轻松排除应用程序安装过程中的故…

C语言--每日选择题--Day31

第一题 1. 下面程序 i 的值为&#xff08;&#xff09; int main() {int i 10;int j 0;if (j 0)i; elsei--; return 0; } A&#xff1a;11 B&#xff1a;9 答案及解析 B if语句中的条件判断为赋值语句的时候&#xff0c;因为赋值语句的返回值是右操作数&#xff1b; …

NIFI源码编译部署在服务器CentOS环境中

一、下载Apache NiFi源码&#xff1a; Apache NiFi官网地址&#xff0c;文档 Apache NiFi源码GitHub地址 二、部署nifi 2.1进入opt目录&#xff0c;并创建software、module [rootlocalhost /]# cd /opt/ [rootlocalhost opt]# ls containerd [rootlocalhost opt]# mkdir s…

vscode-使用vscode编译和代码修改 keil工程

Visual Studio Code必要拓展&#xff08;插件&#xff09;安装 1. Keil Assistant 在拓展搜索栏中输入Keil&#xff0c;找到 Keil Assistant 点击安装下载

小航助学题库蓝桥杯题库python选拔赛(21年3月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSD…