我有这个问题:
创建一个程序来构造一(1)维的晶格,然后
100000个网站。在这个格子中随机放置一些陷阱
分子,其浓度为c。随机放入1个粒子
放置在晶格上,并使其随机行走。在这个步行
您不会设置时间限制,即您不会声明
具体步骤数。当粒子掉落时,行走将停止
在陷阱上..................注意边界
条件。当粒子到达晶格的边界时
不应逃避它,而要保留在格子中,
通过返回原来的位置或放置在
晶格的相对位置........
我创建的代码显示了我的方法(我在其中添加了注释)。
def steps1d(self,pos,c):
#pos: number of positions
#c: concentration of trap-particles
# array full of traps (zeros)
myzeros = sc.zeros(self.c*self.pos)
# grid full of available positions(ones)
grid = sc.ones(self.pos)
# distribute c*pos zeros(traps) in random positions (number of positions is pos)
traps = sc.random.permutation(pos)[:c*pos]
# the grid in which the particle is moving which has traps inside it
grid[traps] = myzeros
steps_count = [] # list which holds the number of steps
free = 0
for i in range(pos):
# the step of the particle can be 0 or 1
step=sc.random.random_integers(0,1)
for step in grid[:]:
if step == 1:
free += 1
steps_count.append(free)
else:
break
return steps_count
我有3个问题:
1)我以pos = 10为例的结果如下:
[1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16、17、18、19、20、21、22、23、24、25 ,26、27、28、29、30、31、32、33、34、35 ...]
我希望每次运行10个数字(可变pos)。
2)我不确定如何处理边界条件。我在想类似的东西:
if free > grid.size:
free = free - 1
但是我无法测试。另外,我不确定这是否适用于网格的两个边界。
3)如果我希望第一步从网格的中间开始,该怎么办?
如果有人对此有所提示,我将不胜感激。
最佳答案
在较小的格子上,查看发生了什么:
import numpy
# Populate the lattice
lattice = numpy.concatenate([numpy.ones(90), numpy.zeros(10)])
numpy.random.shuffle(lattice)
# Intialize problem
in_trap = False
steps = 0
pos = int(numpy.random.randint(0,len(lattice),1))
history = []
while in_trap == False:
# Step of -1 is backward, 1 is forward
step = numpy.random.permutation([-1,1])[0]
# Check position for edges and fix if required
if pos + step > len(lattice) - 1:
pos = 0
elif pos + step < 0:
pos = len(lattice) - 1
else:
pos += step
# Keep track of random walk
history.append(pos)
# Check if it's a trap
if lattice[pos] == 0:
in_trap = True
# If not, continue
steps += 1
print steps
print history
print lattice
我鼓励您在整个打印语句中都添加一些内容,以查看每个变量持有的值。在较小的格子上进行尝试将有助于您了解其工作原理。
编辑:
我将让您弄清楚细节,但是我会将其包装在如下函数中。它设置功能,然后准备空的步骤和历史记录列表以保存每次运行的结果。我们运行该函数,然后将结果附加到这些列表中。
def lattice():
code
return steps, history
steps = []
histories = []
for i in range(0,10):
num_steps, history = lattice()
steps.append(num_steps)
histories.append(history)