【建议收藏】利用python基于模拟退火计算QUBO表达式(内附代码)

news2025/1/21 6:00:07

文章目录

  • 引言
  • 模拟退火算法
    • 模拟退火的理论过程
    • 模拟退火在优化中的应用
    • 基于python的模拟退火编码流程
    • 定义目标函数
    • 初始化状态
    • 迭代寻找最优
    • 完整代码
    • 模拟退火在求解QUBO表达式中的应用
  • 结束语

引言

在计算QUBO解的过程中,通常需要利用不同的优化算法来计算其结果。

在本文中,我们将带领大家利用python基于模拟退火计算QUBO表达式,并且给出了演示的示例。话不多说,我们开始吧。

模拟退火算法

模拟退火是一种启发式算法,用于解决优化问题。

它基于冶金学中的退火过程,在这个过程中,金属被加热并缓慢冷却以获得所需的结构。

模拟退火的理论过程

该算法从一个初始解决方案开始,然后对其进行随机修改,以寻找更好的解决方案。解决方案的质量由一个目标函数来衡量,该算法接受变化,即使它们会导致更差的解决方案,但其概率会随着时间的推移而降低。这使得该算法能够避免陷入局部最优状态,并探索更大的解决方案空间。

在这里插入图片描述

模拟退火在优化中的应用

模拟退火在优化问题中有很多的应用,主要有以下几种:

  • 参数优化:在机器学习中,模拟退火可以通过在参数空间中搜索,找到全局最优解。

  • 组合优化:模拟退火可以通过在可行解空间中随机搜索,以找到最优解。

  • 线性规划:线性规划问题和组合优化类似,也是指在约束条件下最大化或最小化线性目标函数。模拟退火可以在变量空间中搜索,以找到最优规划。

  • 图形匹配:模拟退火可以通过在图形空间中搜索,在两个图形中找到最大的匹配。

基于python的模拟退火编码流程

定义目标函数

在这个函数中,我们需要对目标函数进行定义,在本文中我们假设目标函数如下:

(1 - x)**2 + 100 * (y - x**2)**2

则定义的目标函数为:

#  Rosenbrock 函数
def rosenbrock(x, y):
    return (1 - x)**2 + 100 * (y - x**2)**2

初始化状态

在这里,我们需要对模型的进行一些初始化,代码如下:

# 随机设置初始化状态
current_state = (random.uniform(-5, 5), random.uniform(-5, 5))
# 初始能量,把初始化状态带入目标函数
current_energy = obj_func(*current_state)

另外,我们还需要记录最优解以及能量值:

best_state = current_state
best_energy = current_energy

迭代寻找最优

在这一步中,我们主要分为以下几个部分来进行计算:

  1. 根据我们设定的温度以及步长进行降温
  2. 随机生成新的状态
  3. 计算能量差
  4. 判断是否得到的结果更优
  5. 如果结果更优则接受新的解,否则以一定的概率接受
  6. 更新最优解

循环进行1-6直到达到了迭代次数,下面为代码:

for i in range(num_iter):
        # 根据我们设定的温度以及步长进行降温
        temperature = init_temp * math.exp(-alpha * i)

        # 随机生成新的状态
        new_state = (random.uniform(-5, 5), random.uniform(-5, 5))
        new_energy = obj_func(*new_state)

        # 判断是否得到的结果更优,如果结果更优则接受新的解,否则以某概率接受
        delta_energy = new_energy - current_energy
        if delta_energy < 0:
            current_state = new_state
            current_energy = new_energy
        else:
            acceptance_prob = math.exp(-delta_energy / temperature)
            if random.random() < acceptance_prob:
                current_state = new_state
                current_energy = new_energy

        # 更新最优解
        if current_energy < best_energy:
            best_state = current_state
            best_energy = current_energy

完整代码

import math
import random

def rosenbrock(x, y):
    return (1 - x)**2 + 100 * (y - x**2)**2

def simulated_annealing(obj_func, init_temp, alpha, num_iter):
	# obj_func:目标函数
	# init_temp:目标函数
	# alpha:设顶参数
	# num_iter:迭代次数
    current_state = (random.uniform(-5, 5), random.uniform(-5, 5))
    current_energy = obj_func(*current_state)
    best_state = current_state
    best_energy = current_energy
    for i in range(num_iter):
        temperature = init_temp * math.exp(-alpha * i)
        new_state = (random.uniform(-5, 5), random.uniform(-5, 5))
        new_energy = obj_func(*new_state)
        delta_energy = new_energy - current_energy
        if delta_energy < 0:
            current_state = new_state
            current_energy = new_energy
        else:
            acceptance_prob = math.exp(-delta_energy / temperature)
            if random.random() < acceptance_prob:
                current_state = new_state
                current_energy = new_energy
        if current_energy < best_energy:
            best_state = current_state
            best_energy = current_energy

    return best_state, best_energy
# 这里调用了模拟退火算法
best_state, best_energy = simulated_annealing(rosenbrock, init_temp=100, alpha=0.01, num_iter=1000)

模拟退火在求解QUBO表达式中的应用

介绍了模拟退火的用法,我们来进一步介绍其在QUBO表达式求解中的应用。

QUBO是Quadratic Unconstrained Binary Optimization的简称,是一个二进制变量的函数优化问题。

下面我们就演示如何使用模拟退火解决QUBO问题:

  • 想要利用模拟退火解决QUBO问题,首先需要我们明确QUBO的代价函数,我们需要根据实际情况来决定。
  • 其次我们需要一个函数来生成一个相邻状态(在本问题中是附近的解),这在模拟退火中很重要。
  • 最后我们利用模拟退火算法,将QUBO和约束表达式代入后即可求得结果。

首先我们来看代价函数部分的代码:

def QUBO_cost(Q, s):
    """
    计算QUBO表达式的代价函数
    Q: QUBO矩阵
    s: 二进制向量
    """
    cost = 0.0
    for i in range(len(s)):
        for j in range(len(s)):
            cost += Q[i][j] * s[i] * s[j]
    return cost

然后是求近邻状态的代码,这里是随机生成了一个临近的解,如下:


def neighbor(s):
    """
    生成一个邻居状态
    s: 二进制向量
    """
    n = len(s)
    i = np.random.randint(0, n)
    s_new = s.copy()
    s_new[i] = 1 - s_new[i]
    return s_new

最后是利用模拟退火进行求解的代码,主要按照下面的顺序进行:

  • 随机生成初始状态
  • 记录最优状态
  • 计算最优代价
  • 初始化温度
  • 生成邻居状态
  • 计算邻居状态的代价
  • 降温

整个过程都会受到参数的影响,并且根据迭代次数循环上述过程,达到循环次数为止:

def simulated_annealing(Q, max_iter=10000, init_temp=100, cooling_rate=0.99):
    """
    利用模拟退火求解QUBO表达式
    Q: QUBO矩阵
    max_iter: 最大迭代次数
    init_temp: 初始温度
    cooling_rate: 降温速率
    """
    n = len(Q)
    s = np.random.randint(0, 2, n) # 随机生成初始状态
    s_best = s.copy() # 记录最优状态
    cost_best = QUBO_cost(Q, s_best) # 计算最优代价
    temp = init_temp # 初始化温度
    for i in range(max_iter):
        s_new = neighbor(s) # 生成邻居状态
        cost_new = QUBO_cost(Q, s_new) # 计算邻居状态的代价
        delta_cost = cost_new - cost_best
        if delta_cost < 0 or np.exp(-delta_cost / temp) > np.random.rand():
            s = s_new
            cost_best = cost_new
            if cost_best < QUBO_cost(Q, s_best):
                s_best = s.copy()
        temp *= cooling_rate # 降温
    return s_best, cost_best

该函数会返回最优代价以及最优解。

结束语

在本文中,我们介绍了如何利用python基于模拟退火计算QUBO表达式。

如果该文对你有帮助的话,希望你帮我点个收藏以及点赞。

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

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

相关文章

2023 年十大 API 管理趋势

作者郑玩星&#xff0c;API7.ai 技术工程师。 阅读原文 什么是 API&#xff1f;什么是 API 管理&#xff1f; 近期&#xff0c;AIGC&#xff08;AI Generated Content&#xff0c;生成式人工智能&#xff09;在各行业的应用日趋普及。AIGC 服务提供商通过 API 向外部提供其内…

18 隐私模式下面发送 http 请求不成功

前言 是这样的一个情况, 最近 我们服务存在这样的一个问题 是在登录界面, 假设我用户名 或者 密码输入错误, 能够得到真确的结果, 拿到了 正常的 http 响应, 回来 "用户名 或者 密码 不正确 " 但是 假设是在 隐私模式下面, 同样的输入, 同样的服务, 但是结果 不一…

VMware ESXi 7.0 U3l macOS Unlocker OEM BIOS (标准版和厂商定制版)

VMware ESXi 7.0 U3l macOS Unlocker & OEM BIOS (标准版和厂商定制版) 提供标准版和 Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科) 定制版镜像 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-7-u3-oem/&#xff0c;查看最新版…

C++---状态压缩dp---小国王(每日一道算法2023.4.15)

注意事项&#xff1a; 状压dp难度警告&#xff01; 本题为"状态压缩dp—蒙德里安的梦想"的近似题&#xff0c;建议先阅读这篇文章并理解。 题目&#xff1a; 在 nn 的棋盘上放 k 个国王&#xff0c;国王可攻击相邻的 8 个格子&#xff0c;求使它们无法互相攻击的方案…

1~5年的软件测试工程师,该学习哪些知识实现涨薪20K?

工作已经8年有余&#xff0c;这8年里特别感谢技术管理人员的器重&#xff0c;以及同事的帮忙&#xff0c;学到了不少东西。这8年里走过一些弯路&#xff0c;也碰到一些难题&#xff0c;也受到过做为一名测试却经常为系统维护和发布当救火队员的苦恼。遂决定梳理一下自己所学的东…

华为暑期实习

前言&#xff1a; 多行数据需要输入的时候可以用下面的结构&#xff1a; while True:try:n int(input())s input().split()num []for i in s:num.append(int(i))k int(input())print(num[n-k])except:break输入两组数据&#xff1a; 1 8108 17 2542 4218 9064 4908 1526 …

【WLSM、FDM状态估计】电力系统状态估计研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

实验二 图像空间域频率域滤波

一&#xff0e;实验目的&#xff1a; 1. 模板运算是空间域图象增强的方法&#xff0c;也叫模板卷积。 &#xff08;1&#xff09;平滑&#xff1a;平滑的目的是模糊和消除噪声。平滑是用低通滤波器来完成&#xff0c;在空域中全是正值。 &#xff08;2&#xff09;锐化&…

ChatGPT实战100例 - (01) 秒出思维导图

文章目录ChatGPT实战100例 - (01) 秒出思维导图一、需求与思路1. 需求&#xff1a;快速的头脑风暴2. 思路&#xff1a;生成markdown然后转化嗯二、生成markdown语法的思维导图1. 问题2. 回答三、把markdown文本转换成思维导图1. 转换2. 下载ChatGPT实战100例 - (01) 秒出思维导…

Nature Communications|评估推进基于网络的蛋白质-蛋白质相互作用预测的社区工作

题目&#xff1a;Assessment of community efforts to advance network-based prediction of protein–protein interactions 文献来源&#xff1a;Nature Communications | (2023) 14:1582 4 代码&#xff1a;https://github.com/spxuw/PPI-Prediction-Project 内容&#x…

英语基础:四级431、六级没过,考研英语78分经验分享 (23考研)

前言 博主备考时的英语基础&#xff1a;英语四级431分, 六级没过 研究生英语二分数&#xff1a;78分 ps&#xff1a;也许这个分数段不是一些大佬的目标分数 (80)&#xff0c;本篇文章的目的只是帮助一些英语基础差的同学&#xff0c;提供一些备考经验。 一、基础阶段 时间&…

AI与未来文明:人工智能能否重塑人类文化,改变社会生活?

哈喽&#xff0c;大家好&#xff0c;我是木易巷&#xff01; 今天我想和大家深入探讨一个备受关注、广泛讨论的话题&#xff1a;人工智能&#xff08;AI&#xff09;及其对我们人类未来发展的影响&#xff0c;人工智能能否重塑人类文化&#xff0c;改变社会生活&#xff1f; 我…

JVM参数

GC参数 年轻代老年代参数SerialSerial Old-XX:UseSerialGCParallel ScavengeParallel Old-XX:UseParallelGC -XX:UseParallelOldGCParallel NewCMS-XX:UseParNewGC -XX:UseConcMarkSweepGCG1G1-XX:UseG1GCZGCZGC-XX:UseZGC jdk默认GC新生代老年代默认参数jdk8Parallel Scaven…

Ps 毛玻璃效果

哈喽&#xff0c;各位小伙伴&#xff01;今天我们来学习一下如何制作毛玻璃效果&#xff1f; 复制图层 导入一张图片&#xff0c;Ctrlj复制一层&#xff0c;右键—智能对象&#xff08;目的&#xff1a;方便后期更换图片&#xff09; 画矩形 画矩形(不要描边)&#xff0c;…

2023年提供优质客户服务的9种专家方法

随着我们进入 2023年&#xff0c;客户服务从未如此重要。研究表明&#xff0c;86%的客户会为良好的客户服务多支付高达 25%的费用。拥有最佳客户体验的客户比客户体验不佳的客户多花费 140%。 1.确保您拥有一支出色的客户服务团队 创造出色的客户体验意味着拥有合适的团队。但出…

Android 屏幕刷新机制与优化方案~

作者&#xff1a;阿健君 屏幕刷新机制 基本概念 刷新率&#xff1a;屏幕每秒刷新的次数&#xff0c;单位是 Hz&#xff0c;例如 60Hz&#xff0c;刷新率取决于硬件的固定参数。帧率&#xff1a;GPU 在一秒内绘制操作的帧数&#xff0c;单位是 fps。Android 采用的是 60fps&am…

小程序组件的生命周期

组件生命周期 组件的生命周期&#xff0c;指的是组件自身的一些函数&#xff0c;这些函数在特殊的时间点或遇到一些特殊的框架事件时被自动触发。 其中&#xff0c;最重要的生命周期是 created attached detached &#xff0c;包含一个组件实例生命流程的最主要时间点。 …

(链表专题) 83. 删除排序链表中的重复元素 ——【Leetcode每日一题】

83. 删除排序链表中的重复元素 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2] 示例 2&#xff1a; 输入&#xff1a;he…

在线Plist文件格式转Json文件格式

Plist文件是一种用于存储应用程序配置信息的文件格式&#xff0c;其中包含应用程序的各种设置和数据。在过去&#xff0c;Plist文件通常是以 .plist 格式存储的。然而&#xff0c;随着时间的推移&#xff0c;人们开始使用 JSON 格式来存储更复杂的数据结构和数据。如果您需要将…

浏览器便携化操作方法

直接进入主题 如果我们不想把 Chrome 安装进 C 盘&#xff0c;又或者想测试多配置&#xff0c;那么浏览器的便携化就非常重要了。 浏览器便携化的方法有很多&#xff0c;国内常用的有两种。 1、MyChrome MyChrome 最早由网友“甲壳虫”开发&#xff0c;除了浏览器便携化&a…