我有这个问题:
创建一个程序,构建一个一维(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 个数字(可变位置)。
\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)