昇思25天学习打卡营|MQ(mindquantum)编程实践

news2024/11/26 2:41:52

学AI还能赢奖品?每天30分钟,25天打通AI任督二脉 (qq.com)

安装 Packages

# 安装 mindquantum, networkx
!pip install mindquantum -i https://pypi.mirrors.ustc.edu.cn/simple
!pip install networkx -i https://pypi.mirrors.ustc.edu.cn/simple

安装 mindquantum 和 networkx 库。-i 参数指定了镜像源,这里使用的是中国科学技术大学的镜像源,以加快下载速度。

MindQuantum:一个量子计算模拟器库,用于模拟和研究量子计算。
NetworkX:一个图论和网络建模库。

编程实践:量子模拟器

# Numpy 是一个功能强大的Python库,主要用于对多维数组执行计算。
# Simulator 是模拟器,可以模拟量子计算机的计算过程。
import numpy as np                          # 导入numpy库并简写为np
from mindquantum.simulator import Simulator # 导入模拟器

# Simulator 中维护着一个量子态,初始为|0⟩态。
sim = Simulator('mqvector', 1)  # 实例化'mqvector'模拟器,量子比特数为1
print(sim)                      # 打印模拟器信息
/home/nginx/miniconda/envs/jupyter/lib/python3.9/site-packages/mindquantum/simulator/__init__.py:17: UserWarning: Disable mqvector gpu backend due to: Malloc GPU memory failed: cudaErrorInsufficientDriver, CUDA driver version is insufficient for CUDA runtime version
  from .available_simulator import SUPPORTED_SIMULATOR
mqvector simulator with 1 qubit (little endian), dtype: mindquantum.complex128.
Current quantum state:
1¦0〉

导入了 numpy 库用于数值计算,以及 mindquantum 库中的 Simulator 类,用于模拟量子计算。

初始化了一个 mqvector 类型量子模拟器`Simulator`,它有1个量子比特。打印模拟器信息显示当前的量子态,初始状态是|0〉。

# 通过 set_qs() 可以将量子态设置为任意的非零列向量,接口会自动进行归一化。
plus_state = np.array([1, 1])   # 构造¦+⟩态
sim.set_qs(plus_state)          # 将量子态设置为¦+⟩态

quantum_state = sim.get_qs()    # 获取当前量子态
ket = sim.get_qs(ket=True)      # 获取当前量子态的狄拉克符号形式
print('quantum state:', quantum_state)
print('ket:\n', ket)
quantum state: [0.70710678+0.j 0.70710678+0.j]
ket:
 √2/2¦0〉
√2/2¦1〉

将模拟器中的量子态设置为|+〉态(即均匀叠加态),将其设置为模拟器的当前量子态。展示量子态的数值和狄拉克记号形式。

编程实践:量子门

from mindquantum.core.gates import X, Y, H      # 导入量子门
from mindquantum.simulator import Simulator     # 导入模拟器

# 每个量子门都有 matrix() 方法,可以获取该量子门的矩阵形式。
print('Gate name:', X)
gateX = X.matrix()
print(gateX)
Gate name: X
[[0 1]
 [1 0]]
print('Gate name:', Y)
gateY = Y.matrix()
print(gateY)
Gate name: Y
[[ 0.+0.j -0.-1.j]
 [ 0.+1.j  0.+0.j]]
print('Gate name:', H)
gateH = H.matrix()
print(gateH)
Gate name: H
[[ 0.70710678  0.70710678]
 [ 0.70710678 -0.70710678]]

导入 XYH 量子门,打印它们的名称和矩阵形式。X 门是量子比特的翻转门,Y 门是结合了X 和 Z 门的复合旋转,H 门是 Hadamard 门,用于生成叠加态。

# 调用 Simulator 的 apply_gate() 接口可以将量子门作用在量子比特上,使量子态发生演化。
# on() 方法可以指定量子门作用在哪个量子比特上(目标比特),受哪些比特控制(控制比特)。
sim = Simulator('mqvector', 1)          # 实例化一个模拟器
sim.apply_gate(H.on(0))                 # 将H门作用于q0
print(sim)
mqvector simulator with 1 qubit (little endian), dtype: mindquantum.complex128.
Current quantum state:
√2/2¦0〉
√2/2¦1〉

重新实例化了一个模拟器,并将 H 门作用于第一个量子比特 q0,打印模拟器信息(新的量子状态)。

编程实践:量子线路

from mindquantum.core.gates import X, Y, H   # 导入量子门X, Y, H
from mindquantum.core.circuit import Circuit # 导入Circuit模块,用于搭建量子线路
from mindquantum.simulator import Simulator  # 导入模拟器

# 通过“+=”的方式可以轻松地将量子门添加到量子线路中。
circ = Circuit() 			# 实例化一个量子线路
circ += H.on(0)  			# 在线路上的第0个比特添加一个H门
circ += Y.on(0) 			# 在线路上的第0个比特添加一个Y门
circ += X.on(1) 			# 在线路上的第1个比特添加一个X门

print(circ)
      ┏━━━┓ ┏━━━┓   
q0: ──┨ H ┠─┨ Y ┠───
      ┗━━━┛ ┗━━━┛   
      ┏━━━┓         
q1: ──┨╺╋╸┠─────────
      ┗━━━┛         

创建一个量子线路,将H、Y、X门依次作用在不同的量子比特上,然后打印线路信息。

mat = circ.matrix() 		# 获取线路对应的矩阵
print('circuit matrix:\n', mat)
circuit matrix:
 [[0.+0.j         0.+0.j         0.-0.70710678j 0.+0.70710678j]
 [0.+0.j         0.+0.j         0.+0.70710678j 0.+0.70710678j]
 [0.-0.70710678j 0.+0.70710678j 0.+0.j         0.+0.j        ]
 [0.+0.70710678j 0.+0.70710678j 0.+0.j         0.+0.j        ]]
# 调用 Simulator 的 apply_circuit() 接口可以将量子线路作用在量子比特上,使量子态发生演化。
sim = Simulator('mqvector', 2)  	# 实例化一个两比特的模拟器
sim.apply_circuit(circ)          	# 作用量子线路
print(sim)
mqvector simulator with 2 qubits (little endian), dtype: mindquantum.complex128.
Current quantum state:
-√2/2j¦10〉
√2/2j¦11〉

实例化一个包含两个量子比特的模拟器,并将之前构建的量子线路作用于模拟器,然后打印模拟器信息。

编程实践:量子测量

from mindquantum.core.gates import Measure, H, X, Y # 导入量子门X, Y, H和量子测量Measure
from mindquantum.core.circuit import Circuit        # 导入Circuit模块,用于搭建量子线路
from mindquantum.simulator import Simulator         # 导入模拟器

circ = Circuit()                    # 实例化一个量子线路
circ += H.on(0)                     # 在线路上的第0个比特添加一个H门
circ += Y.on(0)                     # 在线路上的第0个比特添加一个Y门
circ += X.on(1)                     # 在线路上的第1个比特添加一个X门

# Measure 与量子门类似,可以用“+=”的方式添加到量子线路中,用 on() 方法指定目标比特。
circ += Measure().on(0)             # 在线路上的第0个比特添加一个测量
circ += Measure().on(1)             # 在线路上的第1个比特添加一个测量

print(circ)
      ┏━━━┓ ┏━━━┓ ┍━━━━━━┑   
q0: ──┨ H ┠─┨ Y ┠─┤ M q0 ├───
      ┗━━━┛ ┗━━━┛ ┕━━━━━━┙   
      ┏━━━┓ ┍━━━━━━┑         
q1: ──┨╺╋╸┠─┤ M q1 ├─────────
      ┗━━━┛ ┕━━━━━━┙         

增加量子测量门到线路中,测量第0和第1个量子比特。

# 调用 Simulator 的 sampling() 接口可以对某一线路的演化结果进行多次采样,获得量子测量的统计结果。
# 这一过程与真实量子计算机的运行方式相似。
sim = Simulator('mqvector', 2)              # 实例化一个两比特的模拟器
result = sim.sampling(circ, shots=1000) 	# 对该线路的演化结果进行1000次采样
print(result)
shots: 1000
Keys: q1 q0│0.00   0.126       0.253       0.379       0.505       0.631
───────────┼───────────┴───────────┴───────────┴───────────┴───────────┴
         10│▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
           │
         11│▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
           │
{'10': 495, '11': 505}

对量子线路进行1000次采样,获取测量结果的统计分布。

编程实践:量子近似优化算法

from mindquantum.algorithm import MaxCutAnsatz
from mindquantum.core.operators import Hamiltonian, QubitOperator
from mindquantum.framework import MQAnsatzOnlyLayer
import networkx as nx
import mindspore.nn as nn

# 构造待求解图
graph = nx.Graph([(0, 1), (1, 2), (2, 3), (3, 4), (0, 4), (0, 2)])
nx.draw(graph, with_labels=True)

导入必要的QAOA相关模块及其他库。创建并绘制一个图。

# 将图转化为目标哈密顿量
pauli_ops = QubitOperator()
for i in graph.edges:
    pauli_ops += QubitOperator(f'Z{i[0]} Z{i[1]}')
ham = Hamiltonian(pauli_ops)

# 构造线路
circ = MaxCutAnsatz(list(graph.edges), depth=4).circuit
circ.svg()

将图转化为求解MaxCut问题的哈密顿量。构建量子线路用于求解MaxCut问题,并展示线路。

# 创建模拟器,backend使用‘mqvector’,能模拟5个比特('circ'线路中包含的比特数)
sim = Simulator("mqvector", 5)

# 生成计算变分量子线路的期望值和梯度的算子
grad_ops = sim.get_expectation_with_grad(ham, circ)

# 生成待训练的神经网络
net = MQAnsatzOnlyLayer(grad_ops)

# 设置针对网络中所有可训练参数、学习率为0.05的Adam优化器
opti = nn.Adam(net.trainable_params(), learning_rate=0.05)

# 生成能对神经网络进行一步训练的算子
train_net = nn.TrainOneStepCell(net, opti)

for i in range(200):

    # 将神经网络训练一步并计算得到的结果(切割边数)。注意:每当'train_net()'运行一次,神经网络就训练了一步
    cut = (len(graph.edges) - train_net()) / 2

    # 每训练10步,打印当前训练步数和当前得到的切割边数
    if i % 10 == 0:
        print("train step:", i, ", cut:", cut)
train step: 0 , cut: [3.0004158]
train step: 10 , cut: [4.342516]
train step: 20 , cut: [4.6596413]
train step: 30 , cut: [4.7887754]
train step: 40 , cut: [4.8642898]
train step: 50 , cut: [4.8967166]
train step: 60 , cut: [4.9271173]
train step: 70 , cut: [4.9367566]
train step: 80 , cut: [4.937892]
train step: 90 , cut: [4.93888]
train step: 100 , cut: [4.9390755]
train step: 110 , cut: [4.939164]
train step: 120 , cut: [4.939247]
train step: 130 , cut: [4.939247]
train step: 140 , cut: [4.9392557]
train step: 150 , cut: [4.9392557]
train step: 160 , cut: [4.939257]
train step: 170 , cut: [4.939257]
train step: 180 , cut: [4.939257]
train step: 190 , cut: [4.939257]

1. 创建训练算子`TrainOneStepCell`:
   - TrainOneStepCell是一个MindSpore的类,用于封装神经网络训练的单步操作。它包含了定义的量子神经网络`net`和优化器`opti`。
2. 训练循环:
   - 运行一个200步的循环,每一步都对神经网络进行一次训练。
   - train_net()更新神经网络的参数,并返回当前的期望值。
   - 计算出当前得到的切割边数`cut`,即图的边被切割的数量。
3. 打印结果:
   - 每10步打印一次当前的训练步骤和切割边数,以便观察训练效果。

量子近似优化算法(QAOA)是一种利用量子计算实现组合优化问题的算法,例如最大切割问题(MaxCut)。在过程中:
1. 定义图:
   - 给定一个图,其中每个节点代表一个量子比特,每条边代表一个相互作用。
2. 转换为Hamiltonian形式:
   - 图中的每条边被转换成一个PauliZ算符的乘积。
3. 构建量子线路:
   - 使用QAOA构建深度为4的Ansatz线路,该线路通过一系列参数化的量子门来近似图的最大切割。
4. 训练量子神经网络:
   - 利用MindSpore API,定义了一个量子神经网络并使用Adam优化器来调整参数,以最小化目标Hamiltonian的期望值。
5. 观察输出:
   - 输出显示在训练过程中逐渐找到图的最大切割边数的优化过程。
例子展示了如何使用MindQuantum结合经典优化算法来解决量子计算中的组合优化问题,从量子模拟器的初始化、量子门的应用、量子线路的构建到量子测量的采样,以及使用量子近似优化算法解决实际问题的完整流程。QAOA是一种特别有前景的近似算法,它使用量子线路和经典优化器来针对一类特定问题近似找到最优解。

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

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

相关文章

脸书登录指南:如何在同一台设备登录多个Facebook账号?

海外社媒营销人员和跨境卖家现在越来越依赖社交媒体平台来拓展业务和接触潜在客户,尤其是Facebook。然而,在进行脸书登录时,你可能会问:如何在同一台设备上登录多个Facebook账号,而不违反Facebook的使用条款&#xff1…

指针与数组笔试题解析

文章目录 1.一维数组1.1 整型数组1.2 字符数组 2. 二维数组3.指针笔试题3.1 练习13.2 练习23.3 练习3 数组名的意义: 1.sizeof(数组名),这里的数组表示整个数组,计算的整个数组的大小 2.&数组名,这里的数组名表示整个数组的&a…

【Diffusion学习】【生成式AI】Stable Diffusion、DALL-E、Imagen 背後共同的套路

文章目录 图片生成Framework 需要3个组件:相关论文【Stable Diffusion,DALL-E,Imagen】 具体介绍三个组件1. Text encoder介绍【结论:文字的encoder重要,Diffusion的模型不是很重要!】评估指标:…

用go实现限流算法

文章目录 固定窗口优缺点:适用场景:总结: 滑动窗口优缺点:适用场景:总结: 漏桶限流器优缺点:适用场景:总结: 令牌桶优缺点:适用场景:总结&#xf…

定义损失函数并以此训练和评估模型

基础神经网络模型搭建 【Pytorch】数据集的加载和处理(一) 【Pytorch】数据集的加载和处理(二) 损失函数计算模型输出和目标之间的距离。通过torch.nn 包可以定义一个负对数似然损失函数,负对数似然损失对于训练具有多…

炎炎夏日,这份锂电AGV叉车保养指南赶紧收藏!

AGV 随着工厂自动化、计算机集成制造系统技术的逐步发展以及柔性制造系统、自动化立体仓库的广泛应用,AGV(Automatic GuidedVehicle)即自动导引车作为联系和调节离散型物流系统以使其作业连续化的必要的自动化搬运装卸手段,其应用范围和技术水平得到了迅…

云服务器实际内存与购买不足量问题

君衍 一、本篇缘由二、问题研究1、dmidecode2、dmesg | grep -i memory 三、kdump四、解决方案1、卸载kdump-tools2、清理依赖包3、修改配置文件4、重新生成配置文件5、重启服务器6、再次查看 一、本篇缘由 本篇由于最近买了云服务器,之前基本在本地使用VMware进行虚…

初识单片机之点亮LED灯

1、前言 如果说编程的开始是Hello world,那么单片机的开始就是点亮LED灯,这个操作最直接的展示了单片机强大的控制功能,这里我就以直接点亮指定位置的LED灯的形式演示这个功能。 2、原理介绍 我的单片机的LED灯都是接在单片机的P1口,从P10~P…

【数据结构(邓俊辉)学习笔记】高级搜索树02——B树

文章目录 1. 大数据1.1 640 KB1.2 越来越大的数据1.3 越来越小的内存1.4 一秒与一天1.5 分级I/O1.6 1B 1KB 2. 结构2.1 观察体验2.2 多路平衡2.3 还是I/O2.4 深度统一2.5 阶次含义2.6 紧凑表示2.7 BTNode2.8 BTree 3. 查找3.1 算法过程3.2 操作实例3.3 算法实现3.4 主次成本3.…

YOLOv8白皮书-第Y8周:yolov8.yaml文件解读

本文为365天深度学习训练营中的学习记录博客 原作者:K同学啊|接辅导、项目定制 请根据YOLOv8n、YOLOv8s模型的结构输出,手写出YOLOv8l的模型输出 文件位置:./ultralytics/cfg/models/v8/yolov8.yaml 一、参数配置 # Parameters nc: 80 # n…

Bug:时间字段显示有问题

Bug:时间字段显示有问题 文章目录 Bug:时间字段显示有问题1、问题2、解决方法一:添加注解3、解决方法二:消息转换器自定义对象映射器配置消息转换器 1、问题 ​ 在后端传输时间给前端的时候,发现前端的时间显示有问题…

设计模式总结(设计模式的原则及分类)

1.什么是设计模式? 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结…

自动化任务调度,轻松管理海量数据采集项目

摘要: 本文深入探讨了在数据驱动时代,如何通过自动化任务调度轻松驾驭海量数据采集项目,提升工作效率,确保数据处理的准确性和及时性。我们分享了一系列实用策略与工具推荐,帮助企业和开发者优化数据采集流程&#xf…

SQL 中的 EXISTS 子句:探究其用途与应用

目录 EXISTS 子句简介语法 EXISTS 与 NOT EXISTSEXISTS 子句的工作原理实际应用场景场景一:筛选存在关联数据的记录场景二:优化查询性能 EXISTS 与其他 SQL 结构的比较EXISTS vs. JOINEXISTS vs. IN 多重 EXISTS 条件在 UPDATE 语句中使用 EXISTS常见问题…

基于 AntV F2 的雷达图组件开发

本文由ScriptEcho平台提供技术支持 项目地址:传送门 基于 AntV F2 的雷达图组件开发 应用场景介绍 雷达图是一种多变量统计图表,用于可视化展示多个维度的数据。它通常用于比较不同对象的多个属性或指标,直观地反映各维度之间的差异和整体…

LoRaWAN协议

目录 一、介绍 1、LPWA是什么? 2、LoRa是什么? 3、LoRaWAN是什么? 4、浅谈LoRa与LoRaWAN的区别 5、LoRaWAN开发背景 6、LoRaWAN与NB-IOT如何选择? 二、LoRaWAN网络结构 1、组网结构 2、星型拓扑结构 三、数据格式 1、…

golang AST语法树解析

1. 源码示例 package mainimport ("context" )// Foo 结构体 type Foo struct {i int }// Bar 接口 type Bar interface {Do(ctx context.Context) error }// main方法 func main() {a : 1 }2. Golang中的AST golang官方提供的几个包,可以帮助我们进行A…

代码随想录算法训练营第五十五天|101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿

101.孤岛的总面积 题目链接:101.孤岛的总面积沉没孤岛 文档讲解:代码随想录 状态:不会 思路: 步骤1:将边界上的陆地变为海洋 步骤2:计算孤岛的总面积 题解: public class Main {// 保存四个方…

【UE5.1】NPC人工智能——02 NPC移动到指定位置

效果 步骤 1. 新建一个蓝图,父类选择“AI控制器” 这里命名为“BP_NPC_AIController”,表示专门用于控制NPC的AI控制器 2. 找到我们之前创建的所有NPC的父类“BP_NPC” 打开“BP_NPC”,在类默认值中,将“AI控制器类”一项设置为“…

动手学深度学习——3.多层感知机

1.线性模型 线性模型可能出错 例如,线性意味着单调假设: 任何特征的增大都会导致模型输出的增大(如果对应的权重为正), 或者导致模型输出的减小(如果对应的权重为负)。 有时这是有道理的。 例…