Python - конструкция решетки, которая захватывает молекулы - не работает правильно - PullRequest
1 голос
/ 07 ноября 2011

У меня есть эта проблема:

Создать программу, которая строит решетку из одного (1) измерения и 100000 сайтов. В этой решетке на случайных позициях ставят ряд ловушек молекулы, которые будут иметь концентрацию в. Поместите 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 чисел за 1 прогон (переменная pos).

2) Я не уверен, как справиться с граничными условиями. Я думаю что-то вроде:

if free > grid.size:
    free = free - 1

Но я не могу это проверить. Кроме того, я не уверен, применимо ли это к обеим границам сетки.

3) Если я хочу, чтобы первый шаг начинался с середины сетки, как я могу это сделать?

Если у кого-то есть подсказка, я буду благодарен.

Ответы [ 2 ]

2 голосов
/ 07 ноября 2011

На маленькой решетке, чтобы увидеть, что происходит:

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

Я бы посоветовал вам добавить операторы print повсюду, чтобы увидеть, какие значения содержит каждая переменная.Испытание на небольших решетках поможет вам понять, как это работает.

РЕДАКТИРОВАТЬ:

Я собираюсь дать вам понять особенности, но я бы обернул это в функции, как показано,Он настраивает функцию, затем подготавливает пустые шаги и списки историй для хранения результатов каждого прогона.Запускаем функцию, затем добавляем результаты в эти списки.

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)
0 голосов
/ 07 ноября 2011

Часть, где создается сетка, в порядке (хотя вы использовали traps дважды - я полагаю, вам не нужна 1-я строка, а 4-я строка должна быть grid[traps]=0).

Тогда в соответствии с проблемой вы должны поместить молекулу и заставить ее ходить по сетке, и эта часть вашей программы совершенно неверна. Что вам нужно сделать, это найти случайную отправную точку для молекулы (возможно, с sc.random.randint(pos)), а затем подсчитать количество шагов, которые молекула делает, прежде чем попасть в ловушку. Шаги в 1d случайном блуждании могут быть либо влево (starting_point - 1), либо вправо (starting_point + 1). Вы должны выбрать случайным образом значение между [-1, +1], добавить шаг к индексу молекулы в сетке, и если результирующий индекс окажется свободным в сетке, то увеличьте значение переменной free. Если результирующий индекс попадает в ловушку, добавьте переменную free в список steps_count.

Чтобы ответить на ваш второй вопрос, периодические граничные условия можно беспрепятственно применить к сетке, если в качестве индекса молекулы взять остаток от деления index % pos.

...