🎯要点

  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))-1
    return state


def 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*nb
                if cost < 0:
                    s *= -1
                elif rand() < np.exp(-cost*beta):
                    s *= -1
                config[a, b] = s
    return config


def calcEnergy(config):
    energy = 0
    for 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*S
    return 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 = 0
    config = 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 + Ene
        M1 = M1 + Mag
        M2 = M2 + Mag*Mag 
        E2 = E2 + Ene*Ene

    E[tt] = n1*E1
    M[tt] = n1*M1
    C[tt] = (n1*E2 - n2*E1*E1)*iT2
    X[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');

👉更新:亚图跨际

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐