我有这个问题:


  创建一个程序来构造一(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)

10-06 00:02