python- construcción de celosía que atrapa moléculas – no funciona bien

Tengo este problema:

Cree un progtwig que construya una red de una (1) dimensión y 100000 sitios. En esta celosía colocadas en posiciones aleatorias varias moléculas trampa, que tendrán concentración c. Coloque 1 partícula en una posición aleatoria en la red y deje que realice una caminata aleatoria. En esta caminata no colocará una restricción de tiempo, es decir, no declarará un número específico de pasos. La caminata se detendrá cuando la partícula caiga en una trampa ………………………… … Cuidado con las condiciones de contorno. Cuando la partícula alcanza los bordes de la celosía, no se debe permitir que escape de ella, sino que permanezca en la celosía, ya sea volviendo a su posición anterior o colocándose en el sitio opuesto de la celosía … ..

Mi enfoque se muestra en el código que creé (tengo comentarios en él).

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 

Tengo 3 problemas:

1) Los resultados que estoy tomando, por ejemplo, para pos = 10 son algo como:

[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 …]

Yo esperaría 10 números cada uno para 1 carrera (pos variable).

2) No estoy seguro de cómo manejar las condiciones de contorno. Estoy pensando algo como:

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

Pero no puedo probarlo. Además, no estoy seguro de si esto se aplica a ambos bordes de la cuadrícula.

3) Si quiero que el primer paso comience desde la mitad de la cuadrícula, ¿cómo puedo hacerlo?

Si alguien tiene una pista sobre eso, estaré agradecido.

En una celosía más pequeña, para ver qué está pasando:

 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 

Le animo a lanzar declaraciones impresas a lo largo de los valores para cada variable. Probar en celosías más pequeñas te ayudará a entender cómo funciona esto.

EDITAR:

Voy a dejar que descubran los detalles, pero lo resumiría en una función como la siguiente. Establece la función, luego prepara pasos vacíos e listas de historiales para contener los resultados de cada ejecución. Ejecutamos la función, luego agregamos los resultados a esas listas.

 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) 

La parte donde se crea la cuadrícula está bien (aunque usó las traps dos veces, supongo que no necesita la primera línea y la cuarta línea debe ser la grid[traps]=0 ).

Luego, de acuerdo con el problema, tienes que poner una molécula y hacerla caminar en la cuadrícula, y esta parte de tu progtwig está completamente equivocada. Lo que debe hacer es encontrar un punto de inicio aleatorio para la molécula (con sc.random.randint(pos) quizás), y luego contar el número de pasos que la molécula realiza antes de caer en una trampa. Los pasos en la caminata aleatoria 1d pueden ser hacia la izquierda ( starting_point - 1 ) o hacia la derecha ( starting_point + 1 ). Debe elegir aleatoriamente entre [-1, +1] , agregar el paso al índice de la molécula en la cuadrícula y, si el índice resultante parece estar libre en la cuadrícula, aumente la variable free . Si el índice resultante llega a la trampa, agregue la variable free a la lista steps_count .

Para responder a su segunda pregunta, las condiciones de los límites periódicos se pueden aplicar sin problemas a la cuadrícula si toma el rest de la división del index % pos como el índice de la molécula.