Foros del Web » Programación para mayores de 30 ;) » Programación General »

Alforitmo para mezclar, Importante

Estas en el tema de Alforitmo para mezclar, Importante en el foro de Programación General en Foros del Web. Buenas, gente Tengo un problema y necesito de vuestra sapiencia en programación, el problema es el que sigue: Tengo que realizar una rutina de mezcla ...
  #1 (permalink)  
Antiguo 17/11/2008, 12:12
 
Fecha de Ingreso: julio-2006
Mensajes: 2
Antigüedad: 17 años, 9 meses
Puntos: 0
Alforitmo para mezclar, Importante

Buenas, gente

Tengo un problema y necesito de vuestra sapiencia en programación, el problema es el que sigue:

Tengo que realizar una rutina de mezcla un poco especial, para que me entendais, os pongo un ejemplo:

Tenemos un Mazo de 52 cartas, las ponemos en la mesa y las mezclamos como si fueran fichas de domino, una vez realizada la mezcla, las ponemos en su lugar.

Premisas
-No importa la cantidad de iteraciones
-No importa la posicion de las cartas, pero si saber las que estan del derecho y del reves.
-No importa el estado inicial del mazo de cartas.

Gracias, por su atencion e inestimable ayuda
  #2 (permalink)  
Antiguo 17/11/2008, 12:49
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Alforitmo para mezclar, Importante

¿En qué lenguaje de programación?. Puedes tener en un array todos los datos de las cartas y desordenarlo como te plazca.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 17/11/2008, 13:01
 
Fecha de Ingreso: julio-2006
Mensajes: 2
Antigüedad: 17 años, 9 meses
Puntos: 0
Respuesta: Alforitmo para mezclar, Importante

Gracias por el aporte, pero si fuera asi de facil no habria echo la pregunta.

Para que veas la complejidad del asunto, coje un mazo de cartas que tengas en casa, ponlas encima de la mesa y mezclalas con las manos, de forma circular (como si fueran fichas del domino), una vez realizado, observa la mezcla.

Eso es lo que quiero, saber como con un algortimo matemático, el lenguaje de programacion poco importa, VB, C++, Pascal, PHP, Java.

Gracias
  #4 (permalink)  
Antiguo 17/11/2008, 13:03
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Alforitmo para mezclar, Importante

Lo cierto es que no termino de entender, la mayoría de los lenguajes de programación disponen de un método para generar números pseudo-aleatorios con lo cual puedes hacer un desorden parecido .
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #5 (permalink)  
Antiguo 18/11/2008, 02:43
Avatar de JUbach  
Fecha de Ingreso: junio-2007
Ubicación: Terrassa
Mensajes: 5
Antigüedad: 16 años, 10 meses
Puntos: 0
De acuerdo Respuesta: Alforitmo para mezclar, Importante

Las instrucciones pseudo-aleatorias, generan numeros al azar, eso esta bien para meter la mano dentro de una bolsa y sacar un numero, pero en esta mezcla intervienen factores no aleatorios, como:

- Indice de deslizamiento (podemos mezclar en una mesa de madera o metal)
- Indice de insercion de los elementos al mezclar los elementos de forma rotatoria, ellos se interclana entre si.
- La mezcla se hace de forma rotatoria, la mano derecha mezcla de I-D, y la izquierda de D-I.

Es una forma de mezclar controlada, con un formato aleatorio, ademas los elemtos mezclados pueden quedar en posicion normal o invetida.

Se que tu solucion es buena, pero no es lo que necesito.

Gracias
  #6 (permalink)  
Antiguo 18/11/2008, 03:03
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Alforitmo para mezclar, Importante

Yo no entiendo algunas cosas:
- ¿Qué es lo que entiendes por la mezcla circular o rotatoria? Eso de que la mano derecha mezcla de I-D y la mano izquierda de D-I no sé qué quiere decir, qué efecto tiene sobre la mecla.
- Cuando hablas del índice de deslizamiento, me hace pensar: ¿Estás buscando un algoritmo de mezcla o lo que quieres es una simulación de la física de la mezcla?
- La mezcla o es realmente aleatoria o no lo es. Si realmente quieres tener en cuenta la física de la mezcla (índices de deslizamiento, movimientos de las manos, etc, tiendo a pensar que lo que buscas no es un algoritmo aleatorio de mezcla, sino lo que decía, una simulación que aproxime el caso real que sólo es pseudo-aleatorio. ¿Qué es realmente lo que quieres?
  #7 (permalink)  
Antiguo 18/11/2008, 06:01
Avatar de JUbach  
Fecha de Ingreso: junio-2007
Ubicación: Terrassa
Mensajes: 5
Antigüedad: 16 años, 10 meses
Puntos: 0
De acuerdo Respuesta: Alforitmo para mezclar, Importante

Pues, quiero una simulacion de mezcla, realmente es eso lo que pretendo.

Gracias por todo, si tienes la forma de hacerlo seria genial, no soy ingeniero y no se por donde empezar.

Gracias
  #8 (permalink)  
Antiguo 18/11/2008, 07:01
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Alforitmo para mezclar, Importante

El problema es que una simulación es bastante más compleja. De hecho, la fidelidad de la simulación (cuánto se parece a la realidad) influirá bastante sobre la complejidad de la simulación.


Te puedo dar algunas ideas de por dónde empezar. No hace falta ser ingeniero (aunque ayuda xD).

Primero partes de la situación real que quieres simular. En este caso la mezcla de cartas. Es buena idea coger una mesa y una baraja y hacerlo un par de veces físicamente (en este caso el caso real a simular es sencillo de llevar a cabo, no necesitas un equipo muy complejo).

Entonces te fijas en la situación, los elementos que entran en juego. Divides el problema en partes, en elementos que interactúan. En este caso es sencillo: Hay 1 superficie y hay 40 x (1 carta). (40 o 52, según la baraja). Lo pongo así, 40 x 1 carta porque una primera cosa que puedes suponer es que todas las cartas se comportan igual.

Además hay dos movimientos (ojo, no he entendido exactamente tu explicación de cómo se mueven las manos, así que lo que digo a continuación puede no ser exacto) o fuerzas que se aplican a las cartas. Imagino que son movimientos de rotación + traslación. La traslación en principio nos da igual, pero podemos descomponer la rotación en dos rotaciones: una de la carta sobre sí misma y otra de la carta alrededor de un punto externo (p.ej. el centro de la mesa). [NOTA 1]

Aquí es donde empiezas a parametrizar. Tienes que establecer un modelo de cómo se mueven las cartas teniendo en cuenta esas fuerzas y teniendo en cuenta el rozamiento con la mesa y todos los factores que quieras tener en cuenta (p.ej. los choques entre cartas, diferentes humedades o limpieza de las cartas, etc). Además, y aquí es donde entra la parte aleatoria, debes parametrizar las fuerzas o movimientos de las manos de modo que sean una función pseudo-aleatoria. Es decir, establecido cómo es el movimiento básico, debes añadir unos factores de ruido y dispersión: Las manos no se mueven siempre exactamente con la misma fuerza.

Hecho eso, llegas a unas fórmulas, más o menos complejas, según las cosas que hayas querido tener en cuenta. Con esas fórmulas lo que debes hacer es llegar a una función final que relacione el ángulo de giro final de una carta con las fuerzas (parametrizadas) originales.

En fin, que al final llegas a una fórmula que relaciona ese ángulo de giro [NOTA 2] final de la carta con una serie de parámetros como: el índice de rozamiento, el ángulo de giro de la posición en que estaba originalmente, la fuerza con que se mezcla, el número de veces que se aplica el movimiento de mezcla, etc, etc. Ahí revisas tus parámetros. Si tienes demasiados, si hay parámetros que no te interesan, simplificas dándoles algún valor fijo. Si, al contrario, te falta algún parámetro, revisas tu proceso de modelado del problema para ver dónde interviene ese parámetro y lo introduces apropiadamente en las fórmulas y vuelves a hacer el desarrollo.


Una vez llegada a la función "buena", la miras y ves que uno de los parámetros es el ruido, la aleatoriedad, las pequeñas variaciones. (Pequeñas o no tanto, según tú mismo hayas modelado). A partir de ahí, haces un análisis estocástico. Fijas los parámetros conocidos con los valores conocidos del problema y quedan sólo los parámetros aleatorios. Entonces, tomas una serie grande de datos aleatorios (los puedes generar tú o buscar por ahí alguna sucesión pseudo-aleatoria o buscar un generador de números o lo que prefieras y necesites) y les aplicas la función y sacas un número muy grande de simulaciones o resultados posibles, que son los que analizarás estadísticamente.



Todo esto lo puedes complicar o simplificar todo lo que quieras. Añadir más factores o eliminar parámetros dándoles un valro fijo igual para cualquier situación... Depende un poco de lo real que quieras que sea la simulación y del tiempo/esfuerzo que quieras dedicarle.

En fin, que espero que estas indicaciones te sirvan de algo.




[NOTA 1] Ya digo que no lo tengo del todo claro el movimiento que comentas, pero imagino que otra simplificación del problema es que las fuerzas que pueden generar las manos son "simétricas", sólo cambia el sentido de giro que aplican.
[NOTA 2] También debes establecer qué consideras por derecho y por invertido. Una idea buena puede ser decir que una carta se considerará al derecho si tras los movimientos queda con un ángulo de giro entre +90º y -90º.
  #9 (permalink)  
Antiguo 18/11/2008, 09:19
Avatar de JUbach  
Fecha de Ingreso: junio-2007
Ubicación: Terrassa
Mensajes: 5
Antigüedad: 16 años, 10 meses
Puntos: 0
De acuerdo Respuesta: Alforitmo para mezclar, Importante

GRACIAS!!!!!

Un aporte genial, y me ha despejado muchas dudas.

Hoy mismos empiezo la programación, si no es mucho preguntar para colgar el algoritmo en la web, que es mejor, java, perl, c?

Ya me diras.

Gracias
  #10 (permalink)  
Antiguo 18/11/2008, 12:09
venkman
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Alforitmo para mezclar, Importante

Mejor es con lo que te sientas más cómodo, lo que conozcas mejor.

Luego hay otros factores como el tipo de interfaz que quieres hacer. Si quieres hacer que se acceda desde una página web... Hay muchas opciones. Sin ningún orden de preferencia: Java, PHP, Perl, Python, Javascript, Ruby... Lo dicho, lo mejor es que elijas lo que mejor conozcas.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:11.