Python程序为王兰道算法停后一点

Python程序为王兰道算法停后一点,python,function,infinite-loop,montecarlo,mtrace,Python,Function,Infinite Loop,Montecarlo,Mtrace,我编写了一个python代码来在3D聚合物上执行Wang Landau算法。现附上相关代码 1) 原始代码:WL3D.py from scipy import * import sys import numpy as np from pylab import * from spinfun import SARW from spinfun import Energy from spinfun import Transform from spinfun import Equality Niter

我编写了一个python代码来在3D聚合物上执行Wang Landau算法。现附上相关代码

1) 原始代码:WL3D.py

from scipy import *
import sys
import numpy as np
from pylab import *
from spinfun import SARW
from spinfun import Energy
from spinfun import Transform
from spinfun import Equality

Niter = int(input("Enter number of MC steps:"))
L=int(input("Enter number of monomers:"))
N=int(input("Enter the dimensions of lattice:"))
spin=zeros((N,N,N), dtype=int)

#1)Initialisation of lattice
#Gx,Gy,Gz=SARW(spin,N)
Gx=[300, 300, 300, 299, 299, 298, 297, 297, 298, 299, 299, 299, 299, 298, 298, 298, 297, 297, 297, 297, 298, 298, 298, 298, 298, 297, 297, 297, 297, 297, 297, 298, 298, 299, 300, 300, 300, 299, 299, 299, 300, 300, 299, 299, 299, 300, 300, 300, 300, 300, 300, 300, 300, 299, 299, 298, 297, 297, 298, 299, 299, 299, 299, 298, 298, 298, 297, 297, 297, 297, 298, 298, 298, 298, 298, 297, 297, 297, 297, 297, 297, 298, 298, 299, 300, 300, 300, 299, 299, 299, 300, 300, 299, 299, 299, 300, 300, 300, 300, 300]
Gy=[300, 301, 302, 302, 301, 301, 301, 300, 300, 300, 300, 300, 300, 300, 301, 302, 302, 302, 302, 302, 302, 302, 302, 301, 300, 300, 300, 301, 301, 301, 300, 300, 301, 301, 301, 302, 303, 303, 302, 302, 302, 301, 301, 301, 302, 302, 301, 300, 300, 300, 300, 301, 302, 302, 301, 301, 301, 300, 300, 300, 300, 300, 300, 300, 301, 302, 302, 302, 302, 302, 302, 302, 302, 301, 300, 300, 300, 301, 301, 301, 300, 300, 301, 301, 301, 302, 303, 303, 302, 302, 302, 301, 301, 301, 302, 302, 301, 300, 300, 300]
Gz=[300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 299, 298, 297, 297, 297, 297, 297, 298, 299, 300, 300, 299, 298, 298, 298, 298, 297, 297, 298, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 298, 298, 298, 298, 297, 297, 297, 297, 297, 298, 299, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 299, 298, 297, 297, 297, 297, 297, 298, 299, 300, 300, 299, 298, 298, 298, 298, 297, 297, 298, 299, 299, 299, 299, 299, 299, 299, 299, 299, 299, 298, 298, 298, 298, 297, 297, 297, 297, 297, 298, 299]
for p in range(50):
    spin[Gx[p],Gy[p],Gz[p]]=1
E1=Energy(Gx,Gy,Gz,spin)
print "Initial energy of system is",E1
f1=open("Initial_Data.txt",'w')
for i in range(len(Gx)):
    f1.write("%d %d %d \n"%(Gx[i],Gy[i],Gz[i]))
f1.close()

#2) Matrices and terms required
Ener=(arange(59)-58).tolist()  #List of energy values
E0=-58 #GRound state
lngE=zeros(len(Ener),dtype=float) #LogG
Hist=zeros(len(Ener),dtype=float)
lnf=1.0
#3)The WLA

for time in range(Niter):
    i2=0
    while i2 < L:
        #E1=Energy(Gx,Gy,Gz,spin)
        Gx1,Gy1,Gz1=Transform(Gx,Gy,Gz,spin)   #Attempting a random move
        E2=Energy(Gx1,Gy1,Gz1,spin)   #Energy calculation of changed configuration
        P = exp(lngE[E1-E0]-lngE[E2-E0]) #Acceptance probability
        if P > uniform(0,1):
            Gx,Gy,Gz=Equality(Gx1,Gy1,Gz1)
            print 'Ok', Gx[0],Gy[0],Gz[0],E1,E2,time,i2
            E1=E2
        else:
            spin[Gx1[0],Gy1[0],Gz1[0]]=0
            spin[Gx[49],Gy[49],Gz[49]]=1
            print 'Not Ok',Gx[0],Gy[0],Gz[0],E1,E2,time,i2
        Hist[E1-E0] += 1.0
        lngE[E1-E0] += lnf
        i2=i2+1
    if time % 1000 == 0:
        Ha = sum(Hist)/(len(Hist))
        Hmin = min(Hist)
        if Hmin > 0.8*Ha:
            print time,'Histogram is flat', Hmin, Ha, 'f=',exp(lnf),'lnf=',lnf
            Hist=zeros(len(Hist))
            lnf=lnf/2.0
            if abs(lnf-0.0) < 0.00000001:
                break
        else:
            print time,'Not flat',Hmin, Ha, 'f=',exp(lnf),'lnf=',lnf



f=open("Final_Data.txt",'w')
for i5 in range(len(lngE)):
    f.write("%f %f \n"%(Ener[i5],lngE[i5]))
f.close()
上面这一行显然遇到了一堆打印出来的语句,在几行之后,它开始执行代码。这就是它想要用输入测试代码的地方。所以我给出了必要的输入,它现在运行一个无限循环

我无法追溯到算法的哪一部分在无限循环中发送代码。有没有其他可能的方法来解决这个问题?非常感谢您的帮助

附言:我希望您在运行代码时添加以下详细信息

python -m trace --trace WL3D.py
输入MC步数:您可以根据需要给出任意整数

输入单体的数量:50(我已经写了这个代码来第一次为50个聚合物单体工作)


输入lattice:600的维度(您可以使用任何整数,但对于我发送代码的方式,600是必需的。如果您注释第17-21行并取消注释第16行,您可以使用任何整数)

这是一个相当复杂的代码,我不太明白不同部分应该做什么,但是我很确定问题出在
转换
函数中。如果向while循环添加一个计数器,您将看到有时
g<1
条件将保持为true,并且代码将永远不会退出循环。我注意到您初始化并更新了
g1
,但您从未使用过它。也许你忘了添加连接
g
g1
的东西?

这是一个相当复杂的代码,我不太明白不同的部分应该做什么,但我很确定问题出在
转换
函数中。如果向while循环添加一个计数器,您将看到有时
g<1
条件将保持为true,并且代码将永远不会退出循环。我注意到您初始化并更新了
g1
,但您从未使用过它。也许你忘了添加连接
g
g1
的东西?

对不起,是的,代码看起来很复杂,因为它还没有优化。关于您指出的内容,这里使用“g”作为控制变量,以确保在退出循环并由函数返回之前满足一次if条件。我想我没有好好分析它,我会处理它,看看这是否解决了问题对不起,是的,代码看起来很复杂,因为它还没有优化。关于您指出的内容,这里使用“g”作为控制变量,以确保在退出循环并由函数返回之前满足一次if条件。我没有考虑对其进行很好的分析,我想,我会处理它,看看这是否解决了问题
python -m trace --trace WL3D.py