domingo, 23 de septiembre de 2012

Algoritmo de round-robin(Sistema todos vs todos)

Hoy traigo el algoritmo de round-robin, o mejor conocido como el de todos contra todos.
El sistema de todos contra todos o sistema de liga es un sistema de competición, generalmente deportiva, en que todos los participantes del torneo se enfrentan entre ellos en un número constante encuentros. Este tipo de competición es también llamado liguilla o round-robin.

Para determinar el calendario del torneo, se realiza un simple algoritmo de selección. A cada uno de los competidores se le asigna un número y se van rotando los números, dejando uno fijo. Por ejemplo, en un torneo con 10 equipos:

1ª ronda: (A contra J, B contra I, … )
 A B C D E 
 J I H G F

2ª ronda: (A contra I, J contra H, … )
 A J B C D  
 I H G F E

/**
*
* @author ISC-Luis
*/
public class RoundRobin {

    public static void main(String[] args) {
        RoundRobin rr = new RoundRobin();
        for (int i = 0; i < 9; i++) {
            rr.mostrar();
            rr.combinar();
        }  
    }

    private String[] equipos= new String[10];

    public RoundRobin() {
        this.equipos[0]="A";
        this.equipos[1]="B";
        this.equipos[2]="C";
        this.equipos[3]="D";
        this.equipos[4]="E";
        this.equipos[5]="F";
        this.equipos[6]="G";
        this.equipos[7]="H";
        this.equipos[8]="I";
        this.equipos[9]="J";
    }

    public void combinar(){            
        String buffer=equipos[equipos.length-1];
  
        for (int i = equipos.length-1; i > 1; i--) {
            equipos[i]=equipos[i-1];
        }
        equipos[1]=buffer;  
    }

    public void mostrar(){
        for (int i = 0, j=equipos.length-1; i<j; i++, j--) {
            System.out.println(equipos[i]+" vs "+ equipos[j]);
        }
        System.out.println("*************************************");
    }


Allí esta el código del ejemplo del algoritmo de round-robin ya implementado con 10 equipos, en java.!!
Si hay alguna duda o comentario estoy para servirles en lo que se les ofrezca..!

12 comentarios:

  1. Muy bueno, ya habia andando buscandolo y no lo abia encontrado

    ResponderEliminar
  2. Magnifica ayuda al problema en cuestion de round robin.. solo una salvedad en la primera combinacion se emparejan 8 equipos de los 10 existentes ¿no?
    Y por cierto, como harías para incluir una fecha a cada partido que se tenga que disputar?

    un saludo

    ResponderEliminar
    Respuestas
    1. Gracias por interesarte en el post, recuerda que son 10 equipos por lo tanto cada equipo disputara de 9 encuentros en el torneo, si te das cuenta en el metodo main creo un objeto de la clase y en el ciclo for inicio mi variable i=0 luego indico que i sea menor que 9 es decir se repetira 9 beces, recuerda que inicio en 0.
      Osea tomara los valores de 0,1,2,3,4,5,6,7,8 que serian 9 combinaciones.
      RoundRobin rr = new RoundRobin();
      for (int i = 0; i < 9; i++) {
      rr.mostrar();
      rr.combinar();
      }

      Eliminar
    2. Con respecto a la fecha podriamos agregar un objeto de tipo date el cual los usariamos para mostar fechas en el metodo mostrar y ya sea con un auxiliar o editando el ciclo for incrementariamos ese dato. Si gustas intentalo aver si te sale sino me dices tus dudas y te lo programo.

      Eliminar
  3. Muchisimas Gracias me acabas de salvar la vida literalmente y el cuatrimestre :D

    ResponderEliminar
  4. Muchas Gracias...Luis Enrique!
    Gran aporte

    Saludos

    ResponderEliminar
  5. Excelente ejemplo pero como podria hacer para que los equipos sea traidos desde una base de datos !!?

    ResponderEliminar
    Respuestas
    1. Trae todo dentro de un array y sustituis por el array equipos que tienes creados con datos por default

      Eliminar
  6. Y para cantidad de equipos impares ? ahi no saca bien
    En teoria la cantidad de partidos que se deben jugar es:
    (cant*(cant-1))/2 Por ejemplo con 5 datos deberian haber 10 partidos y solo salen 8

    ResponderEliminar
  7. muchas gracias me había elaborado un algoritmo super enquilombado que ademas no funcionaba para hacer un fixture y esto me ayudó.

    ResponderEliminar