量子变分算法 (python qiskit)

背景

        变分量子算法是用于观察嘈杂的近期设备上的量子计算效用的有前途的候选混合算法。变分算法的特点是使用经典优化算法迭代更新参数化试验解决方案或“拟设”。这些方法中最重要的是变分量子特征求解器 (VQE),它旨在求解给定汉密尔顿量的基态,该汉密尔顿量表示为泡利项的线性组合,其中拟设电路中要优化的参数数量是量子比特数量的多项式。鉴于完整解决方案向量的大小是量子比特数量的指数,使用 VQE 成功最小化通常需要额外的问题特定信息来定义拟设电路的结构。
        执行 VQE 算法需要以下组件:汉密尔顿量和假设(问题规范)Qiskit 运行时估计器经典优化器虽然汉密尔顿量和假设需要特定领域的知识来构建,但这些细节对于运行时来说并不重要,我们可以以相同的方式执行广泛的 VQE 问题。

步骤 1 .将经典输入映射到量子问题

        尽管 VQE 算法所讨论的问题实例可能来自各种领域,但通过 Qiskit Runtime 执行的形式是相同的。Qiskit 提供了一个方便的类,用于以泡利形式表达汉密尔顿量,并在 qiskit.circuit.library 中提供了一组广泛使用的假设电路。
        这个示例汉密尔顿量源自量子化学问题。
        设置 

# 导入 VQE 实验所需的工具。ansatz是训练电路。
# General imports
import numpy as np# Pre-defined ansatz circuit and operator class for Hamiltonian
from qiskit.circuit.library import EfficientSU2
from qiskit.quantum_info import SparsePauliOp# SciPy minimizer routine
from scipy.optimize import minimize# Plotting functions
import matplotlib.pyplot as plt
#runtime和session两个类用于管理与 IBM Quantum 运行时服务的连接和会话。
#Estimator类用于估算量子电路运行的期望值,通常用于量子算法中的成本函数评估。
from qiskit_ibm_runtime import QiskitRuntimeService, Session
from qiskit_ibm_runtime import EstimatorV2 as Estimator# 从可用的后端中选择一个负载最少的后端,以便提交作业,即调用真实量子计算机
service = QiskitRuntimeService(channel="ibm_quantum")
backend = service.least_busy(operational=True, simulator=False)# SparsePauliOp 类从给定的 Pauli 表达式和系数创建哈密顿量
hamiltonian = SparsePauliOp.from_list([("YZ", 0.3980), ("ZI", -0.3980), ("ZZ", -0.0113), ("XX", 0.1810)]
)

        选择的假设是 EfficientSU2,它默认以线性方式纠缠量子位,使其成为连接有限的量子硬件的理想选择。

ansatz = EfficientSU2(hamiltonian.num_qubits)
ansatz.decompose().draw("mpl", style="iqp")

num_params = ansatz.num_parameters

这里使用的num_params数为16,即16个量子门。

步骤 2. 优化量子执行问题

        为了减少总作业执行时间,Qiskit 原语仅接受符合目标 QPU 支持的指令和连接的电路(ansatz)和可观察量(Hamiltonian)(称为指令集架构 (ISA) 电路和可观察量)。

        ISA 电路安排一系列 qiskit.transpiler 传递以优化所选后端的电路并使其与后端的 ISA 兼容。这可以通过 qiskit.transpiler 中的预设传递管理器及其optimization_level 参数轻松完成。
        最低优化级别执行使电路在设备上运行所需的最少操作;它将电路量子位映射到设备量子位并添加交换门以允许所有两量子位操作。最高优化级别更加智能,并使用了许多技巧来减少总门数。由于多量子位门具有高错误率并且量子位会随着时间的推移而退相干,因此较短的电路应该会给出更好的结果。

#这个函数用于生成预设的电路优化处理器。
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
#pm 使用指定的目标信息生成一个预设的优化处理器(pass manager)
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)ansatz_isa = pm.run(ansatz)ansatz_isa.draw(output="mpl", idle_wires=False, style="iqp")

 ISA 可观察

        在使用 Runtime Estimator V2 运行作业之前,转换汉密尔顿函数以使其与后端兼容。使用 SparsePauliOp 对象的 apply_layout 方法执行转换

步骤 3. 使用 Qiskit 原语执行

        与许多经典优化问题一样,VQE 问题的解可以表述为标量成本函数的最小化。根据定义,VQE 通过优化假设电路参数来最小化汉密尔顿量的期望值(能量),从而寻找汉密尔顿量的基态解。由于 Qiskit 运行时估算器直接采用汉密尔顿量和参数化的假设,并返回必要的能量,因此 VQE 实例的成本函数非常简单。
        注意,Qiskit Runtime EstimatorV2 的 run() 方法采用原始统一块 (PUB) 的可迭代对象。每个 PUB 都是一个可迭代对象,格式为 (circuit, observables, paramter_values: Optional, precision: Optional)。

#定义一个损失函数
def cost_func(params, ansatz, hamiltonian, estimator):"""Return estimate of energy from estimatorParameters:params (ndarray): Array of ansatz parametersansatz (QuantumCircuit): Parameterized ansatz circuithamiltonian (SparsePauliOp): Operator representation of Hamiltonianestimator (EstimatorV2): Estimator primitive instancecost_history_dict: Dictionary for storing intermediate resultsReturns:float: Energy estimate"""pub = (ansatz, [hamiltonian], [params])result = estimator.run(pubs=[pub]).result()energy = result[0].data.evs[0]cost_history_dict["iters"] += 1cost_history_dict["prev_vector"] = paramscost_history_dict["cost_history"].append(energy)print(f"Iters. done: {cost_history_dict['iters']} [Current cost: {energy}]")return energy

        请注意,除了必须作为第一个参数的优化参数数组之外,使用其他参数来传递成本函数中所需的项,例如 cost_history_dict 。此字典存储每次迭代的当前向量,例如,以防万一由于失败而需要重新启动例程,还返回当前迭代次数和每次迭代的平均时间。

cost_history_dict = {"prev_vector": None,"iters": 0,"cost_history": [],
}
x0 = 2 * np.pi * np.random.random(num_params)

        选择的经典优化器来最小化成本函数。在这里,我们通过最小化函数使用 SciPy 中的 COBYLA 例程。请注意,在实际量子硬件上运行时,优化器的选择很重要,因为并非所有优化器都能同样好地处理嘈杂的成本函数景观。
要开始例程,请指定一组随机初始参数:

        因为我们要发送大量想要一起执行的作业,所以我们使用 Session 在一个块中执行所有生成的电路。这里的 args 是提供成本函数所需的附加参数的标准 SciPy 方法。

with Session(backend=backend) as session:estimator = Estimator(mode=session)estimator.options.default_shots = 10000res = minimize(cost_func,x0,args=(ansatz_isa, hamiltonian_isa, estimator),method="cobyla",)

        在此例程的末尾,我们得到了标准 SciPy OptimizeResult 格式的结果。由此我们可以看出,需要进行 nfev 次成本函数评估才能获得参数角度 (x) 的解向量,当将其插入 ansatz 电路时,就会产生我们正在寻找的近似基态解。

输出

 message: Optimization terminated successfully.success: Truestatus: 1fun: -0.634701203143904x: [ 2.581e+00  4.153e-01 ...  1.070e+00  3.123e+00]nfev: 146maxcv: 0.0

步骤 4. 后处理,以经典格式返回结果

        如果过程正确终止,则 cost_history_dict 字典中的 prev_vector 和 iters 值应分别等于解向量和函数求值总数。这很容易验证: 

all(cost_history_dict["prev_vector"] == res.x)
cost_history_dict["iters"] == res.nfev
fig, ax = plt.subplots()
ax.plot(range(cost_history_dict["iters"]), cost_history_dict["cost_history"])
ax.set_xlabel("Iterations")
ax.set_ylabel("Cost")
plt.draw()

理想状态下,即完成一整轮次的优化,模型成功收敛,代价趋于稳定。 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac 上使用 cmake 构建包含 OpenMP 的项目

安装依赖 # clang 默认不支持 -fopenmp,因为它没有内置 OpenMP 支持。 # 为了解决这个问题,需要安装 libomp 并配置 clang 使用 libomp brew install libomp# macOS 自带的 clang 编译器被修改过,默认禁用了 OpenMP, # 而不支持 …

【K8S系列】Kubernetes Service 基础知识 详细介绍

在 Kubernetes 中,Service 是一种抽象的资源,用于定义一组 Pod 的访问策略。它为这些 Pod 提供了一个稳定的访问入口,解决了 Pod 可能频繁变化的问题。本文将详细介绍 Kubernetes Service 的类型、功能、使用场景、DNS 和负载均衡等方面。 1.…

class 36 二叉树高频题目 - 上 (不含有树形dp)

1. BFS 的两种方式 如下图, 是一个二叉树. 我们需要按照层的方式来遍历这棵树. 1.1 使用 JDK 自带的类实现(链表实现, 经典 BFS) 首先我们实现一个队列, 这个队列从头进, 从尾出.然后将根节点放入其中, 然后将放入的节点弹出,然后继续验证弹出的节点有没有左孩子, 若是有, 将…

【HTML】之form表单元素详解

HTML表单是网页与用户交互的关键组成部分,它允许用户输入数据并将数据提交到服务器进行处理。本文将全面详细地介绍HTML表单的各个方面,从基础元素到高级用法,并提供丰富的代码示例和中文注释,帮助你彻底掌握表单的使用。 1. 表单…

强大!Spring Boot 3.3 集成 PDFBox 轻松实现电子签章功能!

强大!Spring Boot 3.3 集成 PDFBox 轻松实现电子签章功能! 随着数字化办公和电子合同的普及,PDF 文档已经成为很多业务场景中的标准文件格式。为了确保文档的安全性和法律效力,电子签章技术应运而生。电子签章不仅可以证明文件的…

视频美颜平台的搭建指南:基于直播美颜SDK的完整解决方案

众所周知,直播美颜SDK是实现视频美颜功能的核心。本文将详细解析如何基于直播美颜SDK搭建一个完整的视频美颜平台。 一、视频美颜SDK的核心功能 直播美颜SDK作为平台的技术核心,能够提供丰富的美颜效果和稳定的视频处理能力。通常,SDK具备以…

传输层TCP

报头 1.报头和有效载荷如何分离将,有效载荷向上交付? tcp有个标准报头长度为20,那是不是以为我们可以像udp一样分离依靠报头大小去分离,我们仔细去看我们报头中还有个选项没包含到。 我们还有个首部长度,四位可以表…

【Axure高保真原型】分级树筛选中继器表格

今天和大家分享分级树筛选中继器表格的原型模板,点击树的箭头可以展开或者收起子级内容,点击内容,可以筛选出该内容及子级内容下所有的表格数据。左侧的树和右侧的表格都是用中继器制作的,所以使用也很方便,只需要在中…

SwiftUI:单个App支持设置多语言

SwiftUI 全新多语言方案 简化本地化的字符串- WWDC21 - 视频 本地化您的SwiftUI app - WWDC21 - 视频 构建全球化App:本地化的示例- WWDC22 - 视频 构建支持多语言的App - WWDC24 - 视频 单个App支持设置多语言 工程 Info.plist里添加 键值UIPrefersShowingLangua…

论1+2+3+4+... = -1/12 的不同算法

我们熟知自然数全加和, 推导过程如下, 这个解法并不难,非常容易看懂,但是并不容易真正理解。正负交错和无穷项计算,只需要保持方程的形态,就可以“预知”结果。但是这到底说的是什么意思?比如和…

【AI换装整合及教程】CatVTON:时尚与科技的完美融合

在当今数字化时代,时尚行业正经历着一场前所未有的变革,而 CatVTON 作为一款由中山大学、Pixocial 等机构联合研发的轻量化 AI 虚拟换装工具,无疑是这场变革中的璀璨明星。 一、独特的技术架构 CatVTON 基于 Stable Diffusion v1.5 inpainit…

css 切角实现(全)

效果 样式代码 <template><div class"container"><div class"clip-all-angle"> 4个角全部剪切 </div><div class"clip-two-angle"> 切底部两个角 </div><div class"clip-two-top-angle"> …

新鲜出炉,ECCV2024.9.25 首次提出基于 YOLO 目标检测的无源域自适应

原文标题&#xff1a;Source-Free Domain Adaptation for YOLO Object Detection 中文标题&#xff1a;基于 YOLO 目标检测的无源域自适应 论文地址&#xff1a; https://arxiv.org/abs/2409.16538 代码地址&#xff1a; GitHub - vs-cv/sf-yolo 1、Abstract 无源域自适应&…

ACL访问控制

要求&#xff1a; PC1与PC2不能通信。PC1可以和PC3通信。PC2可以和PC3通信。 1. VLAN配置 根据拓扑图的连接&#xff0c;PC1、PC2、PC3属于不同的VLAN。我们需要确保交换机上的端口已经正确划分到不同的VLAN。假设交换机接口的VLAN配置已经完成&#xff08;其他博文有)&…

【Linux】线程池详解及其基本架构与单例模式实现

目录 1.关于线程池的基本理论 1.1.线程池是什么&#xff1f; 1.2.线程池的应用场景&#xff1a; 2.线程池的基本架构 2.1.线程容器 2.2.任务队列 2.3.线程函数&#xff08;HandlerTask&#xff09; 2.4.线程唤醒机制 3.添加单例模式 3.1.单例模式是什么&…

多IP访问网站

1.创建挂载点 mount /dev/sr0 /mnt vim /etc/yum.repos.d/base.repo [BaseOS] nameBaseOS baseurlfile:///mnt/BaseOS gpgcheck0 [Appstream] nameAppStream baseurlfile:///mnt/AppStream gpgcheck0 2.关闭防火墙等 systemctl stop firewalld setenforce 0 3.下载nginx…

【我的 PWN 学习手札】setcontext + shellcode

目录 一、setcontext gadget 二、setcontext shellcode &#xff08;一&#xff09;覆写__free_hook为setcontext53 &#xff08;二&#xff09;在堆块布置了一块sigframe &#xff08;三&#xff09;覆写__free_hook0x8__free_hook0x10 &#xff08;四&#xff09;从__…

流媒体协议.之(RTP,RTCP,RTSP,RTMP,HTTP)(一)

闲着没事做&#xff0c;记录一下开发项目用过的协议&#xff0c;项目中&#xff0c;大多是是实时显示播放的&#xff0c;通过私有协议&#xff0c;传输到上位机&#xff0c;实时播放&#xff0c;延时小于200ms&#xff0c;仿照这些协议&#xff0c;定义的数据格式。如果用这些协…

新王Claude 3.5的6大应用场景

Anthropic AI深夜发布了备受期待的Claude 3.5系列更新&#xff0c;包括了全新升级的Claude 3.5 Sonnet和首发的Claude 3.5 Haiku。 Claude 3.5 Sonnet能够理解细微的指令和上下文&#xff0c;识别并纠正自身错误&#xff0c;还能从复杂数据中生成深入的分析和洞察。 结合最先进…

10.22.2024刷华为OD C题型(三)--for循环例子

脚踝动了手术&#xff0c;现在宾馆恢复&#xff0c;伤筋动骨一百天还真不是说笑的&#xff0c;继续努力吧。 文章目录 靠谱的车灰度图恢复灰度图恢复 -- for循环使用例子 靠谱的车 https://www.nowcoder.com/discuss/564514429228834816 这个题目思路不难&#xff0c;就是要自…