Python和CUDA(C++)量子退火和伊辛二次算法模型

news/2024/10/15 15:51:05/

🎯要点

  1. 简化量子退火或离散优化算法处理,使用张量网络模拟和动态系统方法及神经网络逼近。
  2. 实现并行退火算法和CUDA支持下穷举搜索法
  3. 使用大都会算法模拟二维自旋玻璃伊辛模型并测量磁化率比热容和能量
  4. 对比其他组合优化解方法,使用英伟达A100 GPU测试。

🍁自旋玻璃退火算法

在这里插入图片描述

🍪语言内容分比

在这里插入图片描述
在这里插入图片描述

🍇Python伊辛模型

伊辛模型(或伦茨-伊辛模型)以物理学家恩斯特·伊辛和威廉·伦茨的名字命名,是统计力学中铁磁性的数学模型。该模型由离散变量组成,这些变量表示原子“自旋”的磁偶极矩,可以处于两种状态之一(1 或 −1)。自旋排列成一个图形,通常是晶格(其中局部结构在所有方向上周期性重复),允许每个自旋与其邻居相互作用。相邻的一致自旋的能量低于不一致的自旋;系统趋向于最低能量,但热量会干扰这种趋势,从而产生不同结构相的可能性。该模型允许将相变识别为现实的简化模型。二维方晶格伊辛模型是显示相变的最简单的统计模型之一。

考虑一组 Λ \Lambda Λ 个晶格点,每个点都有一组相邻点(例如一个图)形成一个 d d d 维晶格。对于每个晶格点 k ∈ Λ k \in \Lambda kΛ,都有一个离散变量 σ k \sigma_k σk,使得 σ k ∈ { − 1 , + 1 } \sigma_k \in\{-1,+1\} σk{1,+1},表示点的自旋。自旋配置 σ = { σ k } k ∈ Λ \sigma=\left\{\sigma_k\right\}_{k \in \Lambda} σ={σk}kΛ 是每个晶格点的自旋值分配。对于任何两个相邻位置 i , j ∈ Λ i, j \in \Lambda i,jΛ,存在相互作用 J i j J_{i j} Jij。此外,位置 j ∈ Λ j \in \Lambda jΛ 有一个外部磁场 h j h_j hj 与其相互作用。配置 σ \sigma σ 的能量由哈密顿函数给出:
H ( σ ) = − ∑ ⟨ i j ⟩ J i j σ i σ j − μ ∑ j h j σ j H(\sigma)=-\sum_{\langle i j\rangle} J_{i j} \sigma_i \sigma_j-\mu \sum_j h_j \sigma_j H(σ)=ijJijσiσjμjhjσj
其中第一个和是对相邻自旋对的和(每对都计算一次)。符号 ⟨ i j ⟩ \langle i j\rangle ij 表示位置 i i i j j j 是最近的邻居。磁矩由 μ \mu μ 给出。请注意,上面哈密顿量的第二项中的符号实际上应该是正的,因为电子的磁矩与其自旋反向平行,但通常使用负项。配置概率由温度倒数为 β ≥ 0 \beta \geq 0 β0 的玻尔兹曼分布给出:
P β ( σ ) = e − β H ( σ ) Z β P_\beta(\sigma)=\frac{e^{-\beta H(\sigma)}}{Z_\beta} Pβ(σ)=ZβeβH(σ)
其中 β = 1 / ( k B T ) \beta=1 /\left(k_{ B } T\right) β=1/(kBT),归一化常数
Z β = ∑ σ e − β H ( σ ) Z_\beta=\sum_\sigma e^{-\beta H(\sigma)} Zβ=σeβH(σ)
是配分函数。对于自旋函数 f f f(“可观测”),我们表示为
⟨ f ⟩ β = ∑ σ f ( σ ) P β ( σ ) \langle f\rangle_\beta=\sum_\sigma f(\sigma) P_\beta(\sigma) fβ=σf(σ)Pβ(σ)
f f f 的期望(均值)。

配置概率 P β ( σ ) P_\beta(\sigma) Pβ(σ) 表示系统(在平衡状态下)处于配置 σ \sigma σ 状态的概率。

二维模型模拟

import numpy as np
from numpy.random import rand
import matplotlib.pyplot as plt
def initialstate(N):   state = 2*np.random.randint(2, size=(N,N))-1return statedef mcmove(config, beta):for i in range(N):for j in range(N):a = np.random.randint(0, N)b = np.random.randint(0, N)s =  config[a, b]nb = config[(a+1)%N,b] + config[a,(b+1)%N] + config[(a-1)%N,b] + config[a,(b-1)%N]cost = 2*s*nbif cost < 0:s *= -1elif rand() < np.exp(-cost*beta):s *= -1config[a, b] = sreturn configdef calcEnergy(config):energy = 0for i in range(len(config)):for j in range(len(config)):S = config[i,j]nb = config[(i+1)%N, j] + config[i,(j+1)%N] + config[(i-1)%N, j] + config[i,(j-1)%N]energy += -nb*Sreturn energy/4.def calcMag(config):mag = np.sum(config)return mag

更改这些参数以实现更小(更快)的模拟

nt      = 88         
N       = 16         
eqSteps = 1024       
mcSteps = 1024       T       = np.linspace(1.53, 3.28, nt); 
E,M,C,X = np.zeros(nt), np.zeros(nt), np.zeros(nt), np.zeros(nt)
n1, n2  = 1.0/(mcSteps*N*N), 1.0/(mcSteps*mcSteps*N*N) 
for tt in range(nt):E1 = M1 = E2 = M2 = 0config = initialstate(N)iT=1.0/T[tt]; iT2=iT*iT;for i in range(eqSteps):         mcmove(config, iT)          for i in range(mcSteps):mcmove(config, iT)           Ene = calcEnergy(config)     Mag = calcMag(config)        E1 = E1 + EneM1 = M1 + MagM2 = M2 + Mag*Mag E2 = E2 + Ene*EneE[tt] = n1*E1M[tt] = n1*M1C[tt] = (n1*E2 - n2*E1*E1)*iT2X[tt] = (n1*M2 - n2*M1*M1)*iT
f = plt.figure(figsize=(18, 10));   sp =  f.add_subplot(2, 2, 1 );
plt.scatter(T, E, s=50, marker='o', color='IndRed')
plt.xlabel("Temperature (T)", fontsize=20);
plt.ylabel("Energy ", fontsize=20);         plt.axis('tight');sp =  f.add_subplot(2, 2, 2 );
plt.scatter(T, abs(M), s=50, marker='o', color='RoyalBlue')
plt.xlabel("Temperature (T)", fontsize=20); 
plt.ylabel("Magnetization ", fontsize=20);   plt.axis('tight');sp =  f.add_subplot(2, 2, 3 );
plt.scatter(T, C, s=50, marker='o', color='IndianRed')
plt.xlabel("Temperature (T)", fontsize=20);  
plt.ylabel("Specific Heat ", fontsize=20);   plt.axis('tight');   sp =  f.add_subplot(2, 2, 4 );
plt.scatter(T, X, s=50, marker='o', color='RoyalBlue')
plt.xlabel("Temperature (T)", fontsize=20); 
plt.ylabel("Susceptibility", fontsize=20);   plt.axis('tight');

👉更新:亚图跨际


http://www.ppmy.cn/news/1539487.html

相关文章

上百种【基于YOLOv8/v10/v11的目标检测系统】目录(python+pyside6界面+系统源码+可训练的数据集+也完成的训练模型)

待更新(持续更新&#xff09;&#xff0c;早关注&#xff0c;不迷路............................................................................... 目标检测系统操作说明【用户使用指南】&#xff08;pythonpyside6界面系统源码可训练的数据集也完成的训练模型&#xff…

玩机搞机基本常识-----如何在 Android 中实现默认开启某个功能 修改方法列举

我们有时候需要对安卓系统进行修改。实现其中的某些功能。让用户使用得心应手。节约时间。那么如果要实现系统中的有些功能选项开启或者关闭。就需要对系统有一定的了解。那么在 Android 中实现默认开启某个功能可以通过以下几种方式&#xff1a; 一、在应用的设置中添加选项 …

【mysql】统计两个相邻任务/事件的间隔时间以及每个任务的平均用时

准备步骤1. 设置查询参数部分1.1 设置需要分析的起始时间1.2. 设置需要分析的时间的长度&#xff08;分析的结束时间&#xff09;1.3. 设置分析内容1.4. 设置需要分析的表和字段 2. 自动计算分析2.1 设置起始序号2.2. 筛选user_log表数据并生成带序号的临时表temp_ria2.3. 通过…

Elasticsearch Suggester

概述 Elasticsearch里设计了4 种类别的 Suggester Term Suggester&#xff1a;词条建议器。对给输入的文本进进行分词&#xff0c;为每个分词提供词项建议。Phrase Suggester&#xff1a;短语建议器&#xff0c;在term的基础上&#xff0c;会考量多个term之间的关系Completio…

什么是DApp?DApp开发指南

一、什么是DApp&#xff1f; DApp&#xff08;Decentralized Application&#xff09;&#xff0c;即去中心化应用&#xff0c;是一种基于区块链技术开发的应用程序&#xff0c;与传统的中心化应用不同&#xff0c;DApp不依赖单一服务器或管理主体&#xff0c;而是利用去中心化…

【大数据】Hive快速入门

文章目录 概述一、Hive的基本概念二、Hive的架构与组件三、Hive的特点与优势四、Hive的应用场景五、Hive的官方网站与资源 驱动说明&#xff08;Driver&#xff09;一、主要功能二、与其他组件的交互三、工作流程四、重要性 元数据模型(Metastore)一、Hive元数据模型的基本概念…

C语言笔记 12

逻辑类型 bool&#xff1a;在“#include <stdbool.h>”之后就可以使用bool和true、false 并没有真正的bool量的类型 逻辑运算 逻辑运算是对逻辑量进行的运算&#xff0c;结果只有0或1逻辑量是关系运算或逻辑运算的结果 运算符描述示例结果!逻辑非!a如果a是true结果就是…

RU 19.24 Standalone(GI和DB分开打)

参考文档&#xff1a;Oracle Database Patch 36582629 - GI Release Update 19.24.0.0.240716 2.1.1.1 OPatch Utility Information 12.2.0.1.42 or later 2.1.1.2 Validation of Oracle Inventory 分别在GI和Oracle Home下执行 $ <ORACLE_HOME>/OPatch/opatch lsinven…