Página 2 de 2

Re: RETO I: Indetectables punto net

Publicado: 23 Jun 2016, 12:03
por k0ws
sanko escribió:O poneis el codigo u os dejais de tonterias cabrones
Esto sin código no vale pa'ná.

Re: RETO I: Indetectables punto net

Publicado: 23 Jun 2016, 16:35
por Atrypk
Bueno! Como veo que no saco demasiado tiempo y no quiero demorarlo tampoco mucho, lo que voy a hacer es explicar la solución que quería llevar al lenguaje java.

Aviso! Lee bajo tu responsabilidad, como advertí en post anteriores mi cabeza es un jodi** locura

Mostrar/Ocultar


Re: RETO I: Indetectables punto net

Publicado: 23 Jun 2016, 17:58
por sanko
Atrypk escribió:Bueno! Como veo que no saco demasiado tiempo y no quiero demorarlo tampoco mucho, lo que voy a hacer es explicar la solución que quería llevar al lenguaje java.

Aviso! Lee bajo tu responsabilidad, como advertí en post anteriores mi cabeza es un jodi** locura

Mostrar/Ocultar

Veo por donde vas, pero me ha llamado la atención donde dices 4*(4-1) = 12, la formula para calcular el numero de combinaciones deberia ser 4*3*2*1, es decir 4!, y de forma general n!, OJITO, para este caso, si pidiera formar palabras de longitud M, sería n!/(m-n)!, que seguiria siendo válida aqui puesto que 4!/(4-4)! = 24/0! = 24/1 = 24

De todas formas te puedes llevar ese aplauso porque el mero hecho de intentar hacer el reto ya tiene su mérito brah.
Saludos!

Re: RETO I: Indetectables punto net

Publicado: 24 Jun 2016, 18:12
por sanko
Bueno chicas, voy a dar por concluido este reto para dar pie a alguno más sencillito y que la gente se anime a hacerlo sin que se rompa demasiao la cabeza.
Que yo sepa, han participado 3 personas, aunque directamente en el post solo han participado 2, y solo una de ellas ha proporcionado código.

Luego vamos a darle el aplauso de 10 segundos a k0ws, el aplauso de 7segs a Atrypk y el aplauso de 5 segundos a anelyus.


Primero vamos a analizar la solución propuesta por Kows:
Esta es la que más se asemeja a la fuerza bruta, es una solución no determinista, esto quiere decir que realmente cuando se ejecuta el programa no sabes con certeza que vaya a haber una solución y de hecho cada vez que ejecutes el programa para una misma entrada, la salida será siempre diferente.

Básicamente lo que el hace es un bucle que mientras que el tamaño del vector solución no tenga el mismo valor que el número de combinaciones posibles sin repetición va a desordenar el vector original usando shuffle. No es una mala solución para cuando diversas estrategias no funcionen bien pero tampoco es la solución "más correcta".

Overx se ha tomao la molestia de reformular el problema puesto que es cierto que el código tiene mucho "relleno" de por medio, no era necesario el tener que convertir strings a vectores y generar los vectores solución como strings, ese tipo de relleno hace que sea menos entendible para el resto, de todas formas es solo por que tenga una mejor legibilidad:
a,h = ['a','b','c'],set()
while len(h)!=factorial(len(a)): shuffle(a); h.add("".join(a))
print len(h),h

Pasamos con la solución de atry, el no ha aportado código pero su idea no iba para nada desencaminada.
El buscaba representar el problema en forma de matriz, cada fila o columna de la matriz exceptuando la primera sería un vector solución y la idea sería ir rotando filas/columnas de forma cíclica:
Ej: Cuando rote la primera esta tendra que rotar todas las que hay a continuación y así para cada vector.
Básicamente es la misma idea que la de anelyus pero esta es un poco más original por el hecho de representar el problema en forma de matriz, lo que quieras que no es más cómodo.

La solución de anelyus
es básicamente la misma, la idea de anelyus era que para cada elemento del vector se usaran n bucles. Estas 2 soluciones tienen un problema y es que os podeís imaginar que es una solución ESPECIALMENTE lenta, la complejidad se dispararía tanto que creo que para un vector de longitud 6 ya tardaria la de su madre y más.


Y aqui es donde ya os voy a poner 2 soluciones, una hecha por over (ramifica y poda) y otra propuesta por mi (backtracking), ambas son soluciones buenas pero dependiendo de los requisitos del problema sería mas conveniente usar una en lugar de la otra, para este caso el backtracking nos sobra y nos basta porque el problema es muy sencillo.
Ámbas son soluciones deterministas.

Solución por backtracking:
def backtracking(nivel):
	if(nivel==n):
		print sol
	else:
		for j in range(len(vLetras)):
			if not marca[j]:
				sol[nivel] = vLetras[j]
				marca[j] = True
				backtracking(nivel+1)
				marca[j]= False

#Ejemeplo con abcdef
if "__main__":
	vLetras = ['a', 'b', 'c', 'd', 'f']
	n = len(vLetras)
	marca = [False for x in range(n)]
	sol = [0 for x in range(n)]
	backtracking(0)

El backtracking es una estrategia para encontrar soluciones a problemas con restricciones, la idea que es se hace un recorrido en profundidad con el objetivo de encontrar las soluciones por "fuerza bruta" para algún problema, recalco "fuerza bruta" entre comillas porque realmente no es así, de hecho coloquialmente lo que hace el backtracking es ir probando soluciones que satisfagan las restricciones y en el momento en que se toma una decisión que incumpla la restricción se deshace el/los movimientos, descartando así las soluciones inválidas.

El backtracking (os animo a leer más de ello por el guguel) se utiliza mucho sobretodo cuando se quieren encontrar TODAS las soluciones posibles para un problema, es decir, no es una estrategia para problemas de optimización.


La solución por ramifica y poda: (made by overx)
def f(a,n,p):
  s,x,A = [],[],__import__("Queue").PriorityQueue() ; A.put((1, []))
  while not A.empty():
    (score1, s) = A.get()
    for sk in a:
      s_prime = s + [sk]
      if s_prime[-1] not in s_prime[:-1] and len(s_prime)>0: x.append(s_prime) if len(s_prime)==n else A.put((1, s_prime))
  return x
  
f(["a","b","c","d","e"],5,0)
El ramifica y poda es un variante del backtracking, que para ciertos problemas mejora al backtracking.
¿Por qué?, en ramifica y poda, el recorrido se realiza en anchura, y normalmente se utilizan colas de prioridad sobre las que puedes aplicar distintos heurísticos para que ciertos nodos no lleguen a explorarse si no fuera necesario, ¿Quién necesita explorar un subarbol entero cuando se sabe que al llegar al final no va a ser una solución válida?, como podreis deducir se ahorra un montonazo de tiempo, puesto que los arboles se generan de forma exponencial, el tiempo que se ahorra es mucho.

Ramifica y poda suele usarse más para encontrar UNA solución, normalmente la mejor solución, en este caso como el problema no necesita heurístico pues la solución por ramifica no es la mejor opción, pero es bueno tenerla en consideración para que sepais que para otro tipo de problemas el ramifica y poda MEJORA sustancialmente al BACKTRACKING.

Si alguien quisiera apuntes sobre estos 2 temas que los pida sin miedo que tengo unos resumenes bastante buenos en PDF. (2 paginitas cada estrategia mas o menos)
Para más info: [Enlace externo eliminado para invitados] y [Enlace externo eliminado para invitados]

En este caso se nota a leguas que es determinista porque para una misma entrada SIEMPRE va a tener la misma salida.


Un saludo, espero que a partir de ahora cuando tengais problemas de tipo NP: [Enlace externo eliminado para invitados] tengais en consideración estas 2 estrategias.
Si alguno piensa que esto es una estupidez sin utilidad, sepais que juegos tan conocidos como SUDOKUS, NONOGRAMAS, VARIOS TIPOS DE PUZZLES, entre un sin fin de problemas son facilmente resueltos por estas estrategias.

Re: RETO I: Indetectables punto net

Publicado: 24 Jun 2016, 19:05
por Pink
Hola. Primero felicitarte por pensar en hacer algo mas educativo, practico, emocionante y divertido en el foro.

Seria bueno si pudieras tener permisos para editar el tema y tener todo mas ordenado.

Muy Interesante todas las propuestas. Yo iba a participar pero ando en otras cosas. (Iba a hacer mi implementan de [Enlace externo eliminado para invitados] el fin de semana pero sera para la próxima.)

Una ilustración del problema usando el método Backtracking
[Enlace externo eliminado para invitados]

Espero que mas usuarios se animen y estar disponible para el próximo reto.

Saludos

Re: RETO I: Indetectables punto net

Publicado: 24 Jun 2016, 19:28
por sanko
Un besazo Pink!
Intentaré pensar en una forma más organizada para hacer los retos, subir apuntes y demas cosas. (tal vez un git!)
Es una lastima que no estuvieras para este reto :D pero será por la de problemas que hay jajaja, estarás para el siguiente que es lo que importan

PD: Buena imágen, representa bien el problema :D

Re: RETO I: Indetectables punto net

Publicado: 24 Jun 2016, 19:35
por SuC
Hola,

Me alegra un montón que siga habiendo estas iniciativas en el foro y la gente participe, esperemos que el RETO II llegue pronto!

Espero poder empezar a participar más a menudo en el foro y en temas como este.

Sanko, me alegra ver como avanzas, eres un ídolo crack!

Saludos,

Re: RETO I: Indetectables punto net

Publicado: 24 Jun 2016, 20:30
por sanko
SuC escribió:Hola,

Me alegra un montón que siga habiendo estas iniciativas en el foro y la gente participe, esperemos que el RETO II llegue pronto!

Espero poder empezar a participar más a menudo en el foro y en temas como este.

Sanko, me alegra ver como avanzas, eres un ídolo crack!

Saludos,
Coño cabron! si sigues vivo!!!, deberias pasarte por el skype a saludarnos alguna vez jajaja.
Gracias tio espero que te vaya to bien :D

Re: RETO I: Indetectables punto net

Publicado: 24 Jun 2016, 22:24
por SadFud
SuC escribió:
Sanko, me alegra ver como avanzas, eres un ídolo crack!

Saludos,
Sanko hoy folla xD

Re: RETO I: Indetectables punto net

Publicado: 24 Jun 2016, 23:43
por sanko
SadFud escribió:
SuC escribió:
Sanko, me alegra ver como avanzas, eres un ídolo crack!

Saludos,
Sanko hoy folla xD
De tu enbidia nase mi fama

Re: RETO I: Indetectables punto net

Publicado: 26 Jun 2016, 11:58
por Atrypk
sanko escribió:Bueno chicas, voy a dar por concluido este reto para dar pie a alguno más sencillito y que la gente se anime a hacerlo sin que se rompa demasiao la cabeza.
Que yo sepa, han participado 3 personas, aunque directamente en el post solo han participado 2, y solo una de ellas ha proporcionado código.

Luego vamos a darle el aplauso de 10 segundos a k0ws, el aplauso de 7segs a Atrypk y el aplauso de 5 segundos a anelyus.


Primero vamos a analizar la solución propuesta por Kows:
Esta es la que más se asemeja a la fuerza bruta, es una solución no determinista, esto quiere decir que realmente cuando se ejecuta el programa no sabes con certeza que vaya a haber una solución y de hecho cada vez que ejecutes el programa para una misma entrada, la salida será siempre diferente.

Básicamente lo que el hace es un bucle que mientras que el tamaño del vector solución no tenga el mismo valor que el número de combinaciones posibles sin repetición va a desordenar el vector original usando shuffle. No es una mala solución para cuando diversas estrategias no funcionen bien pero tampoco es la solución "más correcta".

Overx se ha tomao la molestia de reformular el problema puesto que es cierto que el código tiene mucho "relleno" de por medio, no era necesario el tener que convertir strings a vectores y generar los vectores solución como strings, ese tipo de relleno hace que sea menos entendible para el resto, de todas formas es solo por que tenga una mejor legibilidad:
a,h = ['a','b','c'],set()
while len(h)!=factorial(len(a)): shuffle(a); h.add("".join(a))
print len(h),h

Pasamos con la solución de atry, el no ha aportado código pero su idea no iba para nada desencaminada.
El buscaba representar el problema en forma de matriz, cada fila o columna de la matriz exceptuando la primera sería un vector solución y la idea sería ir rotando filas/columnas de forma cíclica:
Ej: Cuando rote la primera esta tendra que rotar todas las que hay a continuación y así para cada vector.
Básicamente es la misma idea que la de anelyus pero esta es un poco más original por el hecho de representar el problema en forma de matriz, lo que quieras que no es más cómodo.

La solución de anelyus
es básicamente la misma, la idea de anelyus era que para cada elemento del vector se usaran n bucles. Estas 2 soluciones tienen un problema y es que os podeís imaginar que es una solución ESPECIALMENTE lenta, la complejidad se dispararía tanto que creo que para un vector de longitud 6 ya tardaria la de su madre y más.


Y aqui es donde ya os voy a poner 2 soluciones, una hecha por over (ramifica y poda) y otra propuesta por mi (backtracking), ambas son soluciones buenas pero dependiendo de los requisitos del problema sería mas conveniente usar una en lugar de la otra, para este caso el backtracking nos sobra y nos basta porque el problema es muy sencillo.
Ámbas son soluciones deterministas.

Solución por backtracking:
def backtracking(nivel):
	if(nivel==n):
		print sol
	else:
		for j in range(len(vLetras)):
			if not marca[j]:
				sol[nivel] = vLetras[j]
				marca[j] = True
				backtracking(nivel+1)
				marca[j]= False

#Ejemeplo con abcdef
if "__main__":
	vLetras = ['a', 'b', 'c', 'd', 'f']
	n = len(vLetras)
	marca = [False for x in range(n)]
	sol = [0 for x in range(n)]
	backtracking(0)

El backtracking es una estrategia para encontrar soluciones a problemas con restricciones, la idea que es se hace un recorrido en profundidad con el objetivo de encontrar las soluciones por "fuerza bruta" para algún problema, recalco "fuerza bruta" entre comillas porque realmente no es así, de hecho coloquialmente lo que hace el backtracking es ir probando soluciones que satisfagan las restricciones y en el momento en que se toma una decisión que incumpla la restricción se deshace el/los movimientos, descartando así las soluciones inválidas.

El backtracking (os animo a leer más de ello por el guguel) se utiliza mucho sobretodo cuando se quieren encontrar TODAS las soluciones posibles para un problema, es decir, no es una estrategia para problemas de optimización.


La solución por ramifica y poda: (made by overx)
def f(a,n,p):
  s,x,A = [],[],__import__("Queue").PriorityQueue() ; A.put((1, []))
  while not A.empty():
    (score1, s) = A.get()
    for sk in a:
      s_prime = s + [sk]
      if s_prime[-1] not in s_prime[:-1] and len(s_prime)>0: x.append(s_prime) if len(s_prime)==n else A.put((1, s_prime))
  return x
  
f(["a","b","c","d","e"],5,0)
El ramifica y poda es un variante del backtracking, que para ciertos problemas mejora al backtracking.
¿Por qué?, en ramifica y poda, el recorrido se realiza en anchura, y normalmente se utilizan colas de prioridad sobre las que puedes aplicar distintos heurísticos para que ciertos nodos no lleguen a explorarse si no fuera necesario, ¿Quién necesita explorar un subarbol entero cuando se sabe que al llegar al final no va a ser una solución válida?, como podreis deducir se ahorra un montonazo de tiempo, puesto que los arboles se generan de forma exponencial, el tiempo que se ahorra es mucho.

Ramifica y poda suele usarse más para encontrar UNA solución, normalmente la mejor solución, en este caso como el problema no necesita heurístico pues la solución por ramifica no es la mejor opción, pero es bueno tenerla en consideración para que sepais que para otro tipo de problemas el ramifica y poda MEJORA sustancialmente al BACKTRACKING.

Si alguien quisiera apuntes sobre estos 2 temas que los pida sin miedo que tengo unos resumenes bastante buenos en PDF. (2 paginitas cada estrategia mas o menos)
Para más info: [Enlace externo eliminado para invitados] y [Enlace externo eliminado para invitados]

En este caso se nota a leguas que es determinista porque para una misma entrada SIEMPRE va a tener la misma salida.


Un saludo, espero que a partir de ahora cuando tengais problemas de tipo NP: [Enlace externo eliminado para invitados] tengais en consideración estas 2 estrategias.
Si alguno piensa que esto es una estupidez sin utilidad, sepais que juegos tan conocidos como SUDOKUS, NONOGRAMAS, VARIOS TIPOS DE PUZZLES, entre un sin fin de problemas son facilmente resueltos por estas estrategias.
Increible, Gracias por dedicar tu tiempo a estas actividades del foro, todo el mundo sabe lo valioso que es el tiempo libre

Si pasas los PDF me interesaría, ya que creo que no llego a entender del todo la solución propuesta. (Voy a darle alguna vuelta más solo lo leí un par de veces) Pero me pareció entender que no saca directamente la solución, sino que va a probando y descartando los que no sirven ¿Estoy muy perdido?

En cualquier caso estudiaré lo que propones y haré lo que me gusta a la hora de aprender, comprender la solución

Espero el siguiente reto

Gracias sanko