[ Foro de Pascal ]

round robin tournament

13-May-2013 22:26
tamuz tech
6 Respuestas

Estimados, saludos, estoy un tanto urgido, deseo orientación para resolver ejercicio programa en pascal basado en algoritmo round robin planteado en: http://www.devenezia.com/downloads/round-robin/index.html, tengo algo de código adelantado pero me gustaría saber si puede ser corregido en privado. Igualmente se que hay una solucion utilizando array bidimensional algo como esto:

Configurar los pares de números del jugador para la ronda 1 en la primera fila de una matriz (matriz bidimensional). Así que para el ejemplo que se muestra esta se vería (1 2 3 10 4 9 5 8 6 7), entonces el resto de la programación se puede llenar mediante la transformación de los números del equipo de la fila de arriba. Para duplicar el algoritmo es lo que se necesita es seguir las siguientes reglas: Si el jugador está por encima de 1 se mantiene igual. Si el jugador está por encima de 2 se convierte en 10 (o el número de jugadores más alto) De lo contrario restar uno del número de equipo por encima.

¿Cómo lo llevo al código en Pascal? Gracias!


15-May-2013 16:43
Nacho Cabanes (+30)

Me temo que no entiendo lo que pretendes...

No sé qué es eso de "si el jugador está por encima de 1 se mantiene igual". Supongo que te refieres a la apariencia de la imagen que hay en

http://www.devenezia.com/downloads/round-robin/

pero creo que no estás entendiendo el concepto: la planificación Round-Robin no usa un array bidimensional, sino que se trata de una cola, de modo que cada proceso vaya a cediendo el paso al siguiente. Tras el último proceso, se vuelve a empezar por el primero, por lo que se puede hablar de que es una "cola circular". Tienes más detalles en la wikipedia, por ejemplo:

http://es.wikipedia.org/wiki/Planificaci%C3%B3n_Round-robin

O en inglés, que suele ser más exhaustivo:

http://en.wikipedia.org/wiki/Round-robin_scheduling


19-May-2013 00:46
tamuz tech

Bien, ciertamente, no me supe explicar, el concepto de round robin no es el de procesos, me refiero a una competición deportiva en el que participen 20 jugadores, debo visualizar en pascal los máximos emparejamientos entre estos. En El algoritmo que aludo se puede utilizar un array bidimensional segun su autor, por eso lo que escribí...Agradecería alguna orientación e este sentido...


19-May-2013 01:24
Nacho Cabanes (+30)

Vale... es algo que han llamado "Round Robin" porque las personas/equipos con los que se empareja el jugador 1 siguen una cola tipo Round-Robin... forma peculiar de nombrarlo...

No tengo claro que necesites un array bidimensional a no ser que tengas que memorizar todos los emparejamientos: si los vas a mostrar (y no almacenar), puedes ir calculando y escribiendo al vuelo. Y si buscas la cantidad (¿te refieres a eso con lo de "máximos emparejamientos"?) no haría falta ni mostrarlos. De hecho, si hay 20 jugadores, y todos deben jugar contra todos, el 1º jugaría contra los 19 restantes, y ese (19) sería el máximo de emparejamientos.

En cualquier caso, yo diría que las discusiones sobre cómo lo plantearía el autor del artículo original, e incluso los algoritmos, los tienes como enlaces en esa página:

http://www.devenezia.com/downloads/round-robin/social-teams-for-12players.html

http://www.devenezia.com/javascript/article.php/RoundRobin2.html

http://www.devenezia.com/javascript/article.php/RoundRobin1.html


21-May-2013 17:51
tamuz tech

Bien, voy por otro camino...Me interesa recibir ayuda con este código, necesito visualizar emparejamientos máximos disjuntos para competición con veinte jugadores, cómo puedo mejorarlo, como puedo agregar el grafo en pascal y como puedo visualizar un calendario en rango de fechas que me muestre un encuentro en particular?, agradecido por la colaboración que pueda dispensarme:

 
program socc;
  uses
     crt;
 
  var
    k, j, x, y : integer;
  begin
     clrscr;
      for j := 0 to 9 do
      begin
         writeln('J = ',j);
       for k := 0 to 9 do
       begin
        write('K = ',k,'   ');
        x := k + j;
        y := 20 - k - 1 + j;
        y := y mod 20;
        writeln(x,'  ',y);
     end;
     readkey;
     clrscr;
    end;
  end.
 




25-May-2013 13:02
Nacho Cabanes (+30)

A ver... que no hay ningún comentario en el fuente...

Parece que ese programa te genera una secuencia de emparejamientos (una jornada de la competición, supongo), espera a que pulses una tecla, borra la pantalla y vuelve a generar una nueva secuencia. Así hasta 10 veces.

Ok. ¿A qué te refieres con "agregar el grafo"?  ¿Y el calendario? ¿Es mostrar la fecha que corresponde a cada jornada?  Para eso, podrías pedir la fecha inicial y crearte una función que calcule una fecha válida a partir de cierta fecha, sumándole una cierta cantidad de días (típicamente, 7). Según el compilador que uses, una forma que puede ser fácil para conseguirlo es convertir la fecha a un formato más compacto (por ejemplo, número de días o de segundos desde 1970, algo que se suele llamar "TimeStamp"), incrementarla y volver a convertir a fecha (usando funciones del sistema) el número resultante.

Las funciones de fecha de FreePascal las puedes encontrar aquí. Verás que tienes rutinas ya creadas para convertir de fecha a TimeStamp y vicecersa, entre otras:

http://www.freepascal.org/docs-html/rtl/sysutils/datetimeroutines.html


18-Nov-2014 00:24
Invitado (STAR)

PERO ESTO NO LO EXPLICA COMO  SE DEBE HACER






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)