Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Algoritmo para un Calendario de Juegos(Baseball, por ejemplo) (https://www.clubdelphi.com/foros/showthread.php?t=63633)

Peterlolazo 23-02-2009 23:50:43

Algoritmo para un Calendario de Juegos(Baseball, por ejemplo)
 
hmm, Necesito ayuda para desarrollar el algoritmo para hacer un calendario de Juegos para una cantidad de equipos dada...
La verdad no pido el codigo en delphi, ya que planeo hacerlo en Vb o en Java, asi que eso no es realmente importante. Pero si alguien de casualidad lo tiene tambien me serviria para yo desarrollar el mio propio..
Bueno, en concreto. lo que este programa debe hacer es lo siguiente..

Si Se introduce por teclado(un textbox o algo parecido) un numero(entre 4 y 20) el programa deberia desplegar.

Por ejemplo: si se introduce el no. 4:

1-2 / 3-4
1-3 / 2-4
1-4 / 2-3

"Como se puede apreciar aqui, solo hay una ronda de juegos, lo que quiere decir que cada equipo se enfrenta a todos los demas Una sola vez, sin que ningun equipo quede sin enfrentarse a otro"
Si por Ejemplo se introduce el numero 5 el proceso sera el Siguiente...:

1-2 / 3-4 [5]
1-3 / 2-5 [4]
1-5 / 2-4 [3]
1-4 / 3-5 [2]
2-3 / 4-5 [1]

"Como se puede ver aqui, tambien hay una sola ronda de juegos, donde cada equipo llega a enfrentarse con todos los demas sin repetir equipos. pero con la variante de que todos los dias descanza un equipo diferente."

La diferencia entre 4 y 5 es que uno es par y el otro es impar(respectivamente) cuando el numero es par. no descanza nadie.
Mientras que si el numero es Impar, siempre descanza un equipo por dia.

Bueno, esto es todo lo que tengo para explicar mi problema, por favor, si alguien sabe como resolverlo me lo hace saber, Gracias de Antemano.

[Entendido]

Crandel 24-02-2009 12:57:35

Es condición que se jueguen dos partidos por día ?

roman 24-02-2009 17:12:28

No creo que sea tanto po día sino por jornada. O sea, hay que hacer la distribución de los partidos de cada semana.

// Saludos

Peterlolazo 24-02-2009 20:14:12

Cita:

Empezado por Crandel (Mensaje 339141)
Es condición que se jueguen dos partidos por día ?

No, no es cuestion de que se jueguen 2 partidos por dia Crandel, Es condicion de que se juegen tantos partidos por dia como sean posibles, sin que ningun equipo juege 2 veces el mismo dia y sin que ningun equipo vuelta a jugar contra el mismo contrincante 2 veces. por ejemplo, si fueran 6 equipos el primer dia serian 3 juegos.. por ejemplo.

1-2 / 3-4 / 5-6

Como vez no hay un limite de partidos por dia.

Peterlolazo 24-02-2009 20:15:55

Cita:

Empezado por roman (Mensaje 339166)
No creo que sea tanto po día sino por jornada. O sea, hay que hacer la distribución de los partidos de cada semana.

// Saludos

Tampoco se pide saber cuantos partidos por semana, lo unico que hay como requisito en este programa es que cada equipo juege con todos los demas sin repetirse. y, en caso de que el numero de equipos sea impar, que todos los dias descance un equipo diferente.

fjcg02 25-02-2009 13:09:50

Hacer una matriz de tantas filas y columnas como equipos más una fila

A partir de ahí, tendrás que iterar siempre de izquierda a derecha y de arriba abajo o en columnas, pero siempre en el mismo orden. De no hacerlo así, te saldrán partidos repetidos.
Además, tienes que llevar el control de las columnas y filas que se eliminan en cada iteración.

Ejemplo

Son seis los equipos. Creamos una matriz de filas = nº de equipos más dos y columnas nº de equipos más dos LA diagonal central se anula, ya que no pueden jugar contra sí mismos.
Código:

Anulacion                                                       
        x        1        2        3        4        5        6
        1        x                                       
        2                x                               
        3                        x                       
        4                                x               
        5                                        x       
        6                                                x

Las iteraciones terminan cuando has terminado con todos los partidos del equipo 1. Esto indicará la primera vuelta.
primera jornada:
Iteración 1
Primera columna: El equipo 1 se enfrentará consigo mismo. Como la casilla está ocupada, se sigue con la siguiente columna.
Siguiente columna: Como está vacía, se pone un “1”, primera jornada, partido 1 vs 2. En la primera fila y la primera columna, se marcan las filas y columnas 1 y 2 ya que están ya asignados esos equipos.
Se cuenta 1 en el contador de partidos, que máximo será 3 porque son seis equipos.
Iteración 2: Se salta la fila 2 ya que este equipo está ya ocupado en esta jornada.
Iteración 3: se saltan las columnas 1 y 2 porque los equipos están ocupados. La siguiente columna se salta porque no puede jugar contra sí mismo ¿ quién ganaría ¿
Siguiente columna: como está libre, se pone un “1”, segundo partido de la jornada 1.
Se marcan las filas y columnas de los equipos 3 y 4, ya que ya están asignados para esta jornada.
Se cuenta uno al contador de partidos.
Iteración 4: se saltan las filas 1,2,3 y 4 por estar ya asignados los equipos.
Con el equipo 5 se saltan las columnas de los equipos 1,2 ,3 y cuatro. También la del 5 por ser el mismo equipo. Ponemos en la casilla de los equipos 5 y 6 que está libre otro “1” de la primera jornada.
Se suma uno al contador, como ya hemos llegado a tres, empezamos con la segunda jornada.
El resultado es esta tabla
Código:

Anulacion        si        si        si        Si               
        x        1        2        3        4        5        6
Si        1        x        1                               
Si        2                x                               
Si        3                        x        1               
Si        4                                X               
        5                                        x        1
        6                                                X


Se desmarcan todos los equipos como ocupados.
El resultado es éste
Código:

Anulacion                                                       
        x        1        2        3        4        5        6
        1        X        1                               
        2                x                               
        3                        x        1               
        4                                X               
        5                                        x        1
        6                                                X

Segunda jornada.
Empezamos con la fila del equipo 1. Saltamos las casillas ocupadas. Como la columna del equipo 3 está libre, ponemos un “2” de segunda jornada.
Ponemos las filas y columnas de los equipos 1 y 3 ocupadas.
Aumentamos el contador de partidos.
Pasamos a la fila 2, que no está ocupada.
Saltamos las columnas de los equipos 1, 2 y 3 por lo ya descrito anteriormente. Plantamos un “2” en la casilla de los equipos 2 y 4.
Marcamos las filas y columnas de los equipos 2 y 4 como ocupadas
Aumentamos el contador de partidos, ya nos queda menos.
Pasamos a la fila 5 que es la siguiente libre. Recorremos las filas ocupadas hasta la columna 6. Como ya está rellena por el valor “1”, pasamos de largo. Como no hay más columnas, pasamos a la siguiente fila.
Pasamos a la fila 6, y en la columna del equipo 5 ponemos el valor “2”.
Como ya tenemos los tres partidos por jornada, pasaremos a la siguiente jornada.
Se desmarcan todas las filas y columnas como ocupadas.
Aplicamos el algoritmo hasta el final (nº de equipos - 1), y el resultado deberá salir algo parecido a esto
Código:

Anulacion                                                       
        x        1        2        3        4        5        6
        1        X        1        2        3        4        5
        2                x        5        2        3        4
        3                        x        1               
        4                        4        X        5       
        5                                        X        1
        6                        3                2        X

Y ya está. Si quieres puedes utilizar un valor determinado para rellenar las casillas que están ocupadas temporalmente y te ahorras manejar una fila y una columna.

Espero que te sirva de ayuda. Lo único que necesitas es saber cómo se redimensiona una matriz para asignar las filas y las columnas.
Otra cosa que puedes hacer es hacer un stringgrid para ver en pantalla el resultado.
Y por supuesto, gastar lápiz y papel hasta que ajustes perfectamente el algoritmo.

Ya nos contarás.

Un saludo

Crandel 25-02-2009 13:59:21

Muy buena idea fjcg02, pero estas repitiendo partidos de los equipos 5-6.

Para asegurarte de no repetir se deberia recorrer solo el triangulo superior de la matriz

fjcg02 26-02-2009 13:31:30

Jamás hubiera pensado que nadie leería la solución, y menos chaparsela para encontrar un bug !!
Mis más sinceras felicitaciones, Crandel.
Hay que meter otro par de variantes. Cuando se haga un partido, marcar el reciproco por ejemplo con un 0. Por ejemplo, 1 vs 3, marcar con 0 la casilla 3-1. Si al iterar no se puede completar la jornada - en este caso se repetiría el partido 5-6 en la segunda jornada, habría que desmarcar todos los partidos de la jornada que estamos calculando y volver a empezar calculando el primer partido desde el siguiente equipo. ASí hasta que pueda completarse la jornada.
Espero que sea suficiente. El fósforo lo gasté ayer haciendo el algoritmo.

Saludos

Peterlolazo 27-02-2009 01:19:41

Y no hay una manera mas simple de hacerlo?, pk la verdad he leido ese post que dejaste como 5 veces y no logro imaginarme como voy a poner eso en codigos jajajaja.

fjcg02 27-02-2009 15:14:59

Sí que habría una manera más fácil de hacerlo. Quedamos en cuántos eurakos me vas a dar y te paso el código. Así sólo haces copiar y pegar, que obviamente es más sencillo.
Creo que Crandel también estará de acuerdo ;-)
Ya sabes, son los tiempos, que están muy achuchaos... y los pañales muy caros.

Saluditos ;):D

Peterlolazo 27-02-2009 20:20:31

jajajaja, pues eso se resume en que voy a leer mas detenidamente el otro post XD jajajaja de cualquier manera Gracias ^^

Crandel 27-02-2009 22:36:27

Cita:

Empezado por fjcg02 (Mensaje 339585)
Sí que habría una manera más fácil de hacerlo. Quedamos en cuántos eurakos me vas a dar y te paso el código. Así sólo haces copiar y pegar, que obviamente es más sencillo.
Creo que Crandel también estará de acuerdo ;-)
Ya sabes, son los tiempos, que están muy achuchaos... y los pañales muy caros.

Saluditos ;):D

Mi hijo ya dejo los pañales, pero igual los gastos van en aumento :D

fjcg02 28-02-2009 14:27:57

Bueno, pues estaremos al tanto para ayudarte en lo que podamos, Peterlolazo.
Lo dicho, gasta mucho lápiz y papel, que es como realmente se aprende !!

Saludos

fidel 28-02-2009 17:10:47

Tengo hecho hace tiempo para mí algo parecido, es para torneos internos en las horas de recreo del instituto, lo que pasa es que mis condiciones son algo diferentes de lo que tu necesitas. Yo tengo varias categorías (grupos), y solo juega un equipo de cada categoría por día, siempre que el nº de campos lo permita, si no hay que ir turnandose y descansando algun grupo algún día.

Alguna idea
-----------

- Supongo que tienes un solo grupo de equipos (también se puede hacer con más)
- Primero se hacen los cruces a una vuelta.
- Si se necesitan una segunda vuelta simplemente se copian los mismos partidos invirtiendo el orden de los equipos.
- Luego se distribuye en cada fecha el máximo nº de partidos posibles con arreglo a los horarios y campos disponibles.

Ejemplo con 4 equipos (es válido para cualquier nº de equipos)
Para hacer los cruces de la primera vuelta, es muy simple, 1-2, 1-3, 1-4, 2-3, 2-4, 3-4, pero esto hace que un equipo juegue todos los partidos seguidos y luego este ocioso, o esta ocioso y luego tiene todos seguidos.

Para hacer los cruces de forma que cada equipo juegue de una manera espaciada durante todo el torneo podemos hacerloa así:

- Supongamos que tienes una tabla EQUIPOS con 4 registros, cada registro tiene un solo campo con el nombre de cada equipo: A, B, C, D
- Creas dos tablas auxiliares AUXEQUIPOS, AUXPARTIDOS
- En la tabla AUXEQUIPOS añades todos los registros de la tabla equipos repetidos tantas veces menos una como equipos hay, en este caso repetidos 3 veces (los 4 equipos repetidos 3 veces) y tendrás en AUXEQUIPOS 12 registros que serán:

A
B
C
D
A
B
C
D
A
B
C
D

Ahora hacemos los partidos:

- Coges en una variable el primer equipo de AUXEQUIPOS que es A como equipo local y lo borras de la tabla.
- Coges en una variable el primer equipo de la tabla (ahora será B) como equipo visitente y guardas en una variable el partido A-B , miras en la tabla AUXPARTIDOS (con locate) si este partido ya existe

... si no existe añades un registro y lo pones como partido y borras el equipo visitante (B en este caso), de AUXEQUIPOS.

... si existe avanzas un registro en AUXEQUIPOS y coges el equipo como visitante y haces el partido y vuelves a mirar si este partido ya existe

Con esto ya tenemos el primer partido y habrán desaparecido los dos equipos que intervienen de la tabla AUXEQUIPOS.

- se sigue haciendo lo mismo para los demás partidos, hasta que la tabla AUXEQUIPOS esté vacia, y en AUXPARTIDOS tendremos todos distribuidos racionalmente:

A-B
C-D
A-C
B-D
A-D
B-C

El equipo a juagará el 1º, 3º y 5º partido, el B el 1º, 4º y 6º, etc.

Si necesitas una segunda vuelta, simplemente añade otros seis registros con los mismos partidos pero invertidos los equipos

A-B
C-D
A-C
B-D
A-D
B-C
B-A
D-C
C-A
D-B
D-A
C-B

Ahora tendrás que asignar fechas a estos partidos que hay que jugar, no es dificil, hazlo en un papel y sigue esos pasos pero programando.

Esto es valido para cuando juegan siempre en campos neutrales. Si es a doble vuelta y cada equipo tiene su campo propio, en el que juega cuando es local, habría que mejorar este sistema.

Quizás sea un poco complicado de entender, pero funciona. Cualquier aclaración sigues preguntando.


La franja horaria es GMT +2. Ahora son las 11:04:35.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi