Asignación de eventos en Python
Alexis Roda
alexis.roda.villalonga en gmail.com
Jue Jul 24 18:09:16 CEST 2008
En/na Joan Pallarès ha escrit:
> Comprobado
>
> He copiado tu código tal cual y me devuelve:
>
> [0, 1, 2]
> [0, 1, 3]
>
> fenómenos paranormales? no creo, debe ser el compilador o que se te ocurre?
> tengo Python 2.5, y lo ejecuto desde Eclipse bajo Windows XP (no me
> critiqueis mucho xD)
Efectivamente, no funciona con python 2.5, sí lo hace con el 2.4. El
problema parece estar relacionado con el uso de iter() en las funciones
genDisponible y generaSoluciones. Aquí tienes código que funciona en
ambas versiones:
def genDisponible(m, e, p) :
ncols = len(m[0])
res = []
for i in xrange(ncols - 1, -1, -1) :
if i not in e and m[p][i] :
res.append(i)
return res
def generaSoluciones(matriz) :
nfilas = len(matriz)
ncols = len(matriz[0])
estado = [-1] * nfilas
disponible = [ None ] * nfilas
fila = 0
disponible[fila] = genDisponible(matriz, estado, fila)
while True :
while not disponible[fila] :
estado[fila] = -1
fila -= 1 # retrocede
if fila < 0 : # no hay mas soluciones
raise StopIteration()
estado[fila] = disponible[fila].pop()
fila += 1
if fila >= nfilas :
yield list(estado)
fila -= 1
else :
disponible[fila] = genDisponible(matriz, estado, fila)
> Entiendo perfectamente lo que es backtracking, y sí, es una buena idea lo
> que me dices de las funciones next y prev pero en el caso real que voy a
> utilizar este algoritmo sera una matriz de 100x100 o incluso más y no
se si
> será del todo eficiente calcular todas las soluciones de golpe.
Porque te empeñas en que el algoritmo calcula todas las soluciones de
golpe ? La función generaSoluciones, y por extensión la clase
Soluciones, solamente calcula UNA SOLUCIÓN CADA VEZ.
Mira el código con más atención y verás que generaSoluciones es una
función generadora. Después relee la respuesta que te mando Cristina Yenyxe.
> Sería mejor
> generar una a una según las pidiera el usuario (pero claro no se
hacerlo).
La clase Soluciones hace justamente eso:
>>> s = Soluciones(parejas)
>>> s._encontrado
[] # no se ha encontrado ninguna solucion
>>> s.next()
[0, 1, 2]
>>> s._encontrado
[[0, 1, 2]] # una solucion encontrada
>>> s.next()
[0, 1, 3]
>>> s._encontrado
[[0, 1, 2], [0, 1, 3]] # dos soluciones encontradas
>>> s.next()
[0, 2, 1]
>>> s._encontrado
[[0, 1, 2], [0, 1, 3], [0, 2, 1]]
>>> s.prev()
[0, 2, 1]
>>> s.prev()
[0, 1, 3]
hay que afinar un poco los métodos next() y prev(), pero como ejemplo ya
vale.
Saludos
_______________________________________________
Lista de correo Python-es
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes
Más información sobre la lista de distribución Python-es