Asignación de eventos en Python

Alexis Roda alexis.roda.villalonga en gmail.com
Mie Jul 23 23:35:58 CEST 2008


En/na Joan Pallarès ha escrit:
> Hola,
> 
> Muchas gracias con tu ayuda. Aunque me interesa alguna forma "más elegante"
> de volver atrás"

En backtracking, volver atrás no significa encontrar la solución 
"anterior" (que me parece que es lo que quieres) sino retroceder, 
deshaciendo el último "cambio" y probando otra posibilidad para 
encontrar la "siguiente" solución.


Para lo que (creo que) quieres solo tienes que implementa una clase con 
dos metodos, prev y next, una lista que almacene las soluciones 
encontradas hasta el momento y el indice de la "solución actual". Si al 
llamar a next no quedan "soluciones anteriores" se calcula una nueva 
solución y se almacena en la lista.

class Soluciones :
     def __init__(self, parejas) :
         self._encontrado = []
         self._indice = 0
         matr = parejasAMatriz(parejas)
         self._generador = iter(generaSoluciones(matr))

     def next(self) :
         if self._indice >= len(self._encontrado) :
             self._encontrado.append(list(self._generador.next()))
         self._indice += 1
         return self._encontrado[self._indice - 1]

     def prev(self) :
         if self._indice <= 0 :
             return None
         self._indice -= 1
         return self._encontrado[self._indice]

Deberías añadir alguna comprobación extra para el caso que se agoten 
todas las soluciones y asegurarte que las comprobaciones que hace son 
correctas.


> acabo de usar tu codigo y me escupe esto:
> 
> Solucion [0, 1, 2]
> Solucion [0, 1, 3]
> [[1, 1, 1, 1], [1, 1, 1, 0], [1, 1, 1, 1]]

No entiendo de donde sale la última linea. Mi código no imprime la matriz!

> por lo que no hace bactracking, no?

El bucle "while not disponible[fila]" implementa el retroceso: si no 
quedan posibilidades para una posición retrocede una posición para 
seguir probando.

> te has olvidado algo? o yo me he dejado algo?

Al ejecutarlo me imprime:

[0, 1, 2]
[0, 1, 3]
...
[3, 2, 0]
[3, 2, 1]



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