Ver Mensaje Individual
  #5 (permalink)  
Antiguo 20/04/2017, 01:10
Tachikomaia
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Curso o info sobre Fuerza bruta y Backtracking?

Cita:
Iniciado por Carlangueitor Ver Mensaje
@Tachikomaia: No estoy justificando el comentario de @aglevia, pero creo que ya se te ha comentado varias veces (incluso yo mismo), sería bueno que por lo menos leyeras un poco más formal acerca de lo que quieres aprender/hacer por lo menos para que te puedas explicar de que es lo que quieres.
Lo que interpreto de eso es que me sugieres ser más formal al hablar o leer algo formal. Sé que la wikipedia no es formal, pero pienso que debería ser suficiente para empezar.
https://es.wikipedia.org/wiki/B%C3%B...e_fuerza_bruta

Se menciona 2 ejemplos:
- encontrar el divisor de un número natural n consistiría en enumerar todos los enteros desde 1 hasta n, chequeando si cada uno de ellos divide n sin generar resto.
- solucionar el problema de las ocho reinas (posicionar ocho reinas en el tablero de ajedrez de forma que ninguna de ellas ataque al resto), consistiría en examinar todas las combinaciones de posición para las 8 reinas, comprobando en cada una de ellas si las reinas se atacan mutuamente.

Es evidente que aplicar la fuerza bruta en el 1er caso es mucho más fácil que aplicarla en el 2ndo, porque en él las condiciones a chequear son más difíciles de describir. En el 1er caso es algo como:
Código:
Resultado = N/Candidato
Si Resultado == Floor(Resultado)
   // Condición cumplida.
El 2ndo caso no lo voy a pensar ahora, pero evidentemente sería más difícil.

Y si en vez del problema de las 8 reinas hablamos de ganar una partida a un rival, más aún.

Entonces, quisiera un libro que tenga MUCHOS problemas resueltos con fuerza bruta, por supuesto mostrando el código de dicha fuerza, no simplemente la solución del problema.

Cita:
¿Exactamente que quieres? ¿Un curso/info de lo que tu llamas backtraking? No entiendo bien tu problema, no entiendo a que te refieres con "grabar las nuevas situaciones que se se produzcan", así que ¿podrías poner un ejemplo más práctico y/o concreto y menos abstracto?
Ok, no fui claro en eso. Te aviso que estoy fuera de forma en ese tema (lo que yo llamo Backtracking), así que no prometo mucho.

Supongamos que esto:

es un laberinto, nuestro personaje se encuentra en la zona 2 y la salida en la 6. El programa comienza a probar acciones, a mover al personaje. La 1era acción lo lleva a la zona 1. En ese momento, se crea un archivo llamado como la situación (1) y que contiene cómo llegó a ella:
Situación_Anterior = 2
Acción_Realizada = 1
Cantidad_de_acciones_realizadas = 1
También se puede hacer con arrays o variables así:
Sit1.Situación_Anterior = 2
Sit1.Acción_Realizada = 1
Sit1.Cantidad_de_acciones_realizadas = 1
...pero prefiero el otro método.
También creamos un archivo llamado Nueva1 que contiene la nueva situación a la que llegamos. Tenemos una variable Nuevas que va aumenta cuando llegamos a una nueva.
Bueno ¿ha llegado la zona 6? No. Entonces volvemos a la situación anterior ¿es posible en ella realizar una acción aún no probada? Sí, una que lleva a la zona 5. ¿Existe el archivo 5.txt? No. Lo creamos con los datos correspondientes, y creamos un archivo Nueva2, idem.
...
Volvemos a la situación anterior ¿queda alguna acción por probar? Sí, una que lleva al 3. Repetimos el proceso. Cuando ya no quedan acciones posibles en una situación, probaremos acciones en las situaciones nuevas, que hemos guardado en los archivos Nueva(númeo aquí) y cuyos datos están en los otros archivos. O sea, los archivos Nueva indican qué archivos cargar.
Cuando se llega a la zona 6, se comienza a crear una lista de las acciones realizadas, para lo cual se carga el archivo que se marque en las variables "Situación_Anterior". Este proceso sería ir hacia atrás, como antes había comentado.

Básicamente, eso. Puede ser búsqueda de camino más corto, pero se puede aplicar en casos en que no hay caminos (sino series de acciones, por ejemplo para lograr un jaque mate), en definitiva no sé técnicamente cómo se le llamaría a mi método. Yo pensé que era Backtracking pero con el tiempo me convencí de que no sé.

Tal vez alcanzaba con cambiar "grabar" con "anotar", pero sino, ya tienes todo el método.

...

Teoría de juegos parece muy avanzado para mí, al menos del modo en que se trata en wikipedia, pero tendría que leerlo con mucha tranquilidad a ver qué logro. Además, es que tiempo después de hacer este tema he tratado de entender (otra vez) cuales son las condiciones posibles básicas en relación con un número, o sea estoy concentrado en eso y ya por ahora no puedo volver a concentrarme en este tema (que supongo es más amplio), pero están relacionados ya que como mencioné me interesa ver ejercicios ordenados por su complejidad lo cual depende de la complejidad de las condiciones a cumplir. En un tiempo supongo que tendré algo interesante, por ahora lo que puedo mostrarte esto esto:
Código:
Nota: Sustituir ? por un símbolo comparador: ==, >, <, =>, <= o !=

Obtener un número ? X
	Obtener un núm ? X o ? Y		Ej: 2 o >4
	*Obtener un núm ? X y ? Y		Ej: >2 y <10
	*Obtener un núm == X Tolerancia Y	Ej: 3 T1: 2 o 3 o 4: =>2 y <= 4
	Obtener un núm ? X y otro ? Y		Ej: 5 y otro != 5
	Obtener el número mínimo
	Obtener el número máximo
	Obtener un número que al sumarle X resulte ? Y
	Obtener un número que al restarle X resulte ? Y
	Obtener un número que al multiplicarlo por X resulte ? Y
	Obtener un número que al dividirlo por X resulte ? Y
		Obtener un número que al dividirlo por X el resto sea ? Y
		Obtener un número que al dividirlo por X tenga ? Y decimales
	Obtener un número que al elevarlo a la X resulte ? Y
	Obtener un número que al radicarlo a la X resulte ? Y
		Obtener un número que al radicarlo a la X el resto sea ? Y
		Obtener un número que al radicarlo a la X tenga ? Y decimales
	Obtener un número cuyo 1er caracter sea ? X
	Obtener un número entero
		Obtener un número cuya parte entera sea ? X
		Obtener un número cuya parte entera tenga ? X números
	Obtener un número decimal
		Obtener un número cuya parte decimal sea ? X
		Obtener un número que tenga ? X decimales
	Obtener un número que al convertirse a binario sea ? X
		Obtener un número que al convertirse a combinatoria bin sea ? X
	Obtener un número de largo ? X
	Obtener un número que al agregarle X al final, sea ? X
		Obtener un número que al "multiplicarlo" por X sea ? Y
			Obtener un número que al "elevarlo" a la X sea ? Y
	Obtener un número que al convertirse a abs sea ? X
	Obtener un número que al aplicarse floor sea ? X
	Obtener un número que al aplicarse ceil sea ? X
	Obtener un número que al aplicarse round sea ? X
	Obtener un número que al quitarle el último num, sea ? X
		Obtener un número que al quitarle los Xs, sea ? Y
			Obtener un número que al quitarle el punto sea ? X
			Obtener un número que al "dividirlo" entre X sea ? Y
				Obte. un núm q al "radicarlo" a la X sea ? Y
Varios puede que no los entiendas, pero no hay problema. Los que están anidados (si es que se dice así) o más anidados es que los considero más complejos que los que lo están menos. La lista no está completa. Y no es que quiera anidar cosas infinitamente, justamente estoy pensando en cual sería "la estructura". Por ejemplo:
"Obtener número..." y acá imaginate que habría un menú que tuviera opciones, como "que sea", "que al", "cuya parte", etc, y luego otro menú de opciones basadas en la que hayas elegido, por ejemplo:

Código:
que sea
	? X
	el mínimo
	el máximo
	entero
	decimal

que al
	sumarle X
	restarle X
	multiplicarlo por X
	dividirlo por X
	elevarlo a la X
	radicarlo a la X
La idea es percibir condiciones sin ser tan repetitivo como lo estaba siendo en la lista que te mostré. Ya esto no tiene tanto que ver con el tema, o al menos no espero hallarlo en un libro, pero bue.