Está en la página 1de 16

PROYECTO 1

GENERADOR DE GRUPOS ALEATORIOS


Alumno

Representa un alumno que tiene un nombre.

Propiedades:

• La propiedad nombre es el nombre completo del alumno (o sea, apellidos y


nombre)
• La propiedad exp es el número de puntos de experiencia del alumno

Métodos:

• El constructor crea un alumno con el nombre y puntos de experiencia pasados


como parámetros. Si los puntos de experiencia son negativos (el 0 si se permite) se
lanzará una IllegalArgumentException con mensaje “Puntos de experiencia
negativos”
• toString: Devuelve una cadena de texto con este formato (lo que está en cursiva
debe sustituirse por el correspondiente valor)

nombre del alumno (EXP: puntos de experiencia)

• compareTo: Se programará de forma que los alumnos se puedan ordenar


alfbéticamente por nombre.
• equals: Se sobreescribirá con el IDE
• hashCode: Se sobreescribirá con el IDE

Test:

1. Crea un alumno llamado Pérez González, Antonio con 8 puntos de experiencia y


comprueba que los métodos nombre() y exp() funcionan correctamente
2. Crea un alumno llamado Pérez González, Antonio con -1 punto de experiencia y
comprueba que se lanza una IllegalArgumentException
3. Crea un alumno llamado Pérez González, Antonio con 8 puntos de experiencia y
comprueba que el método toString devuelve “Pérez González, Antonio (EXP: 8)”
CargadorAlumnos

Esta clase se encarga de coger un archivo de texto que contiene los nombres de
los alumnos (por ejemplo, alumnos.txt) y obtener a partir de ellos una lista de objetos
Alumno

Métodos:

• cargarAlumnos: Recibe como parámetro la ruta de un archivo txt que tiene un


formato como este:

Pérez González, Antonio;3


Gómez Pérez, Isabel;2
Ruíz Ruíz, Jorge;3
Ballesteros, Tony; 2
Smith Pérez, Ana; 1

Como puedes ver, cada línea tiene los datos de un alumno, de forma que primero
viene el nombre y separado por punto y coma, sus puntos de experiencia.

El método comienza creando una lista de alumnos vacía. A continuación abre el


archivo cuya ruta se ha pasado como parámetro y lee de él todas las líneas y por
cada una, forma un objeto Alumno que añade a la lista. Si se produce un error en
algún momento se lanzará una IOException con el mensaje apropiado al error que
ha pasado. Por último, el método devolverá la lista de alumnos ordenada
alfabéticamente por nombre.

Test

Nota: Para hacer los test primero necesitarás hacer un archivo alumnos.txt con los
alumnos escritos en el ejemplo descrito anteriormente.

1. Crea un CargadorAlumnos que lea todos los alumnos del archivo alumnos.txt.
Comprueba que la lista devuelta tiene exactamente 5 alumnos.
2. Añade al test anterior una comprobación de que el primer alumno de la lista se
llama “Gómez Pérez, Isabel” y el último “Smith Pérez, Ana”
3. En un test diferente, crea un CargadorAlumnos que lea los alumnos del archivo
(que no existe) alumnos2.txt. Comprueba que se lanza una IOException.
Equipo

Esta clase representa un equipo de alumnos. Cada equipo tiene un número que lo
identifica (por ejemplo, equipo 1), una lista de miembros y un capitán (que puede estar
vacío).

Propiedades:

• La propiedad número es el número del grupo. Si el número es -1 el equipo


representa a los alumnos que se han quedado sin equipo.
• La propiedad miembros es el conjunto de alumnos que forman parte del grupo.
• La propiedad capitan es el capitán del equipo. Si esta propiedad vale null significa
que el equipo no tiene capitán.

Métodos:

• El constructor crea un equipo con el número pasado como argumento, inicializa los
miembros con un set vacío y deja vacía la propiedad del capitán.
• getNumero: devuelve el número del equipo.
• add: añade un alumno al equipo
• getNumeroAlumnos: devuelve el número de alumnos que hay en el equipo
• setCapitan: cambia el capitán del equipo y le pone el recibido como parámetro.
• getCapitan: devuelve el capitán del equipo
• iterator: Simplemente llama al método iterator del conjunto de miembros y nos
devuelve el iterator que nos de.

Muy importante: ¿Para qué sirve este método? Con él, podemos poner un objeto
Equipo en un for mejorado y recorrer sus alumnos.

• getEstadisticasExp: Devuelve un objeto que nos da estadísticas sobre la


distribución de puntos de experiencia del equipo.
• clonar: Devuelve un objeto Equipo que tiene el mismo número, miembros y capitán
que el que está siendo programado. O sea, nos devuelve un “duplicado” del objeto.
• sacarAlumnoAleatorio: Este método saca del equipo (borrándolo de los miembros)
un alumno aleatorio. Para ello, seguirá estos pasos:
◦ Crea un ArrayList<Alumno> y lo rellena con todos los alumnos del equipo
◦ Genera un número aleatorio entre 0 y el tamaño de la lista, y recupera de la lista
el objeto Alumno que está en esa posición.
◦ Borra el alumno del Set de miembros.
◦ El método termina devolviendo el objeto Alumno extraído aleatoriamente.
• toString: Devuelve una cadena de caracteres formada por un párrafo cuyo formato
es como este ejemplo: (Ayuda: puedes usar \n para bajar de renglón dentro del
String, o puedes usar la clase StringBuilder para generar el String)

Equipo 1 (EXP total: 8, EXP promedio: 2.67, Desviación: 0.47)


- Pérez González, Antonio (EXP: 3)
- Ballesteros, Tony (EXP: 2) [CAPITAN]
- Ruíz Ruíz, Jorge (EXP: 3)
En el caso de que el número de equipo sea -1, en la primera línea, en lugar de
poner “Equipo 1” se pondrá “Sin equipo”

Test

1. Crea un grupo con el número 1 y comprueba que el método getNumero devuelve 1


y que el método getNumeroAlumnos devuelve 0.
2. Crea un grupo con el número 1 y añade al grupo anterior los 3 alumnos que se ven
en la explicación del método toString. Comprueba que getNumeroAlumnos
devuelve 3.
3. Sobre el mismo grupo del apartado anterior, llama al método toString y comprueba
que tiene 4 renglones, que el primer renglón comienza por la palabra “Equipo”, el
segundo por “- Pérez”, el tercero por “- Ballesteros” y el cuarto por “- Ruíz”
EstadisticiasExp

Esta clase permite obtener estadísticas sobre los puntos de experiencia de un


equipo.

Propiedades:

• equipo: Es el equipo del que se van a obtener las estadísticas.

Métodos:

• constructor: inicializa la propiedad con el parámetro recibido

• getTotalExp: Devuelve la suma de los puntos de experiencia de todos los miembros


del equipo

• getExpPromedio: Devuelve la media de los puntos de experiencia de todos los


miembros del equipo

• getDesviacionTipica: Devuelve la desviación típica de los puntos de experiencia de


todos los miembros del equipo. Se calcula de esta forma:

◦ Se hace la media de los cuadrados de los puntos de experiencia de los


miembros del equipo
◦ Se le resta a ese valor la media de los puntos de experiencia de los miembros
del equipo elevada al cuadrado.
◦ A lo que sale, se le calcula la raíz cuadrada

Test:

1. Haz un test que haga todos estos pasos:

◦ Crea un Equipo con número 1 y añade estos miembros:

Pérez González, Antonio, exp 3


Gómez Pérez, Isabel, exp 2
Ruíz Ruíz, Jorge, exp 3
Ballesteros, Tony, exp 2
Smith Pérez, Ana, exp 1

◦ Pide a dicho equipo un EstadisticasExp y comprueba que los métodos


devuelven estos datos (con un error de 0.1 para los datos de tipo double)

▪ getTotalExp → 11
▪ getExpPromedio → 2.2
▪ getDesviacionTipica → 0.74
SelectorCapitan

Esta interfaz representa un objeto que sirve para asignar un capitán a un equipo.

Métodos:

• ponerCapitan: Recibe un equipo y le pone un capitán, de la forma en que sea


programada en las clases que implementan la interfaz.
SelectorCapitanAleatorio

Esta clase sirve para poner a un equipo un capitán aleatorio

Métodos:

• ponerCapitan: Hace lo siguiente:


◦ Crea un List<Alumno> vacio
◦ Hace un recorrido de los miembros del equipo (consulta la documentación de la
clase Equipo) y cada miembro recorrido lo añade a la lista creada anteriormente
◦ Genera un número aleatorio entre 0 y el tamaño de la lista
◦ Obtiene el objeto Alumno cuya posición es el número aleatorio generado
anteriormente
◦ Pone al equipo como capitán al alumno obtenido.

Test

1. Haz un test con todos estos pasos:

◦ Crea un List<Alumno> con estos objetos:

Pérez González, Antonio, exp 3


Gómez Pérez, Isabel, exp 2
Ruíz Ruíz, Jorge, exp 3
Ballesteros, Tony, exp 2
Smith Pérez, Ana, exp 1

◦ A continuación crea un objeto Equipo con número 1 y añade todos los alumnos
de la lista anterior.
◦ Después, obtén un SelectorCapitanAleatorio y haz que le ponga un capitán al
equipo que acabas de hacer.
◦ Comprueba que el equipo tiene un capitán que no es nulo (null)
◦ Comprueba que el capitán del equipo se encuentra guardado en la lista de
alumnos del primer punto.
SelectorCapitanExp

Esta clase sirve para poner a un equipo como capitán al alumno con mayor puntos
de experiencia.

Métodos:

• ponerCapitan: Hace esto:


◦ Recorre los alumnos del equipo recibido como parámetro (consulta la
documentación de la clase Equipo para saber cómo se puede hacer un
recorrido del Equipo) y obtén el objeto Alumno que tiene más puntos de
experiencia (en caso de empate, nos quedamos con cualquiera de ellos).
◦ Pon como capitán del equipo al alumno al alumno obtenido anteriormente.

Test

1. Haz un test con todos estos pasos:

◦ Crea un Equipo con número 1 y añádele estos miembros:

Gómez Pérez, Isabel, exp 2


Pérez González, Antonio, exp 3
Smith Pérez, Ana, exp 1

◦ Después, obtén un SelectorCapitanExp y haz que le ponga un capitán al equipo


que acabas de hacer.
◦ Comprueba que el equipo tiene un capitán que no es nulo (null)
◦ Comprueba que el capitán del equipo tiene 3 puntos de experiencia y se llama
“Pérez González, Antonio”
TipoSelectorCapitan

Es una enum con todas las formas posibles de elegir capitán

Constantes:

• ALEATORIO: Significa que el capitán se elige aleatoriamente


• MAYOR_EXP: Significa que el capitán es el miembro del equipo con mayor puntos
de experiencia.
SelectorCapitanFactory

Esta clase representa un objeto que sirve para obtener un objeto de tipo
SelectorCapitan

Métodos:

• getSelector: Recibe un tipo de selector y crea un SelectorCapitanAleatorio o un


SelectorCapitanExp según el parámetro recibido.
MetodoFormacionEquipos

Esta interfaz representa un algoritmo que se encarga de formar equipos a partir de


una lista de alumnos.

Métodos:

• formarEquipos: Devuelve una lista con los equipos que salen de aplicar el método
de formación que se programe en cada clase hija a la lista de alumnos recibida
como parámetro. El número de miembros de cada equipo es el segundo parámetro
que recibe el método. Los alumnos que sobren se asignarán a un equipo con
número -1, que significa “grupo de alumnos sin equipo”.

• getMetodosFormacionDisponibles: Nos devuelve una lista que contiene un objeto


de la clase FormadorEquiposAleatorios y un objeto de la clase
FormadorEquiposEquilibrados

Test:

1. Comprueba que el método getMetodosFormacionDisponibles nos da una lista con


exactamente 2 elementos y que el primero es de tipo FormadorEquiposAleatorios y
el segundo es de tipo FormadorEquiposEquilibrados.
FormadorEquiposAleatorios

Esta clase permite generar equipos cuyos alumnos se eligen de forma aleatoria.

Métodos:

• formarEquipos: Hace esto:


◦ Crea un List<Equipo> vacio que almacenará los equipos que se tengan que
formar.
◦ Crea un ArrayList<Alumno> y lo rellena con los alumnos de la lista recibida
como parámetro (o sea, es como si hiciéramos una “copia mutable” de la lista
recibida)
◦ Llama al método Collections.shuffle sobre el ArrayList anterior para que este se
desordene de forma aleatoria.
◦ A continuación, imagina que el ArrayList se divide en pequeñas listas del
tamaño que deben tener los equipos (se permite que la última de las listas
tenga un tamaño menor), de forma que cada una de lugar a un nuevo Equipo
◦ Programa la idea anterior para ir distribuyendo los alumnos a los equipos. No
olvides que si el último equipo tiene menos capacidad que los demás, deberá
tener número -1 (esto indica que se trata de un grupo de alumnos sin equipo)
◦ El método devolverá la lista de equipos, una vez que esté rellena.
• toString: Devuelve “Equipos aleatorios”

Test

1. Haz un test que haga estos pasos:

• Crea una lista con estos objetos Alumno:

Pérez González, Antonio, exp 3


Gómez Pérez, Isabel, exp 2
Ruíz Ruíz, Jorge, exp 3
Ballesteros, Tony, exp 2
Smith Pérez, Ana, exp 1
Fernández Fernández, Matilde, exp 2
Martínez Martínez, Juan, exp 1

• Obtén un FormadorEquiposAleatorios, llama al método formarGrupos para hacer


grupos de 3 personas y haz las siguientes comprobaciones:

◦ La lista de grupos que devuelve el método formarEquipos tiene 3 elementos.


◦ Cada uno de los 2 primeros equipos de la lista tiene 3 miembros y el último
tiene 1
◦ El primer grupo de la lista tiene número 1, el segundo 2 y el tercero -1
FormadorEquiposEquilibrados

Esta clase permite generar equipos equilibrados usando un algoritmo genético que
busca minimizar la desviación típica de los puntos de experiencia de los equipos
generados.

¿Cómo funciona este algoritmo? Queremos hacer equipos equilibrados, lo que


significa que los puntos de experiencia de los equipos sean lo más parecidos posibles.
Cuando varios números se parecen, su desviación típica es casi cero. Por tanto, lo que
queremos hacer es obtener equipos de forma que la desviación típica de sus puntos de
experiencia sea lo más cercana a 0 posible. Conseguiremos esto de esta forma:

1. Generamos una lista de equipos aleatoria (aprovecharemos aquí que la clase


FormadorEquiposEquilibrados hereda de FormadorEquiposAleatorios, que ya tiene
ese comportamiento programado).
2. Introducimos una mutación en la lista de equipos, intercambiando de forma
aleatoria dos alumnos cualesquiera de equipos diferentes.
3. Calculamos la desviación típica de la nueva lista de equipos, y si es mayor que la
que teníamos la descartamos. Pero si la desviación obtenida es menor, hemos
encontrado una lista de equipos algo más equilibrada que la que teníamos, y por
selección natural, pasa a ser la lista que buscamos.
4. Se repite el proceso muchas veces (o hasta conseguir desviación típica 0, que
sería el momento en que los equipos están perfectamente equilibrados).

Métodos:

• calcularMedia: Devuelve la media de los puntos de experiencia de los equipos de la


lista pasada como parámetro.
• calcularDesviacionTipica: Devuelve la desviación típica de los puntos de
experiencia de los equipos de la lista. Esto se calcula así:
◦ Se hace la media de los cuadrados de los puntos de experiencia de los equipos
◦ Se le resta a ese valor la media de los puntos de experiencia de los equipos del
equipo, elevada al cuadrado.
◦ A lo que sale, se le calcula la raíz cuadrada
• formarEquipos: Hace esto:
1. Obtiene un List<Equipo> con equipos 100% aleatorios.
2. Se calcula la desviación típica de esa lista de equipos.
3. Se eligen dos equipos aleatorios de la lista y se clonan (esto es para no perder
los equipos originales)
4. Se extrae un alumno aleatorio de uno de los equipos y se añade al otro equipo
5. Se extrae un alumno aleatorio del otro equipo y se añade al otro equipo
6. Se forma una nueva lista de equipos en la que los equipos alterados sustituyen
a los originales, y el resto de equipos se mantiene igual
7. Se calcula la desviación típica de la nueva lista de equipos
8. Si la desviación típica es mayor o igual que la lista original, no hacemos nada,
pero si es menor entonces reemplazamos la lista original con la nueva lista
9. El proceso descrito se repite a partir del punto 2 un máximo de 500 veces o
hasta que la desviación típica obtenida sea 0
10. El método devuelve la última lista de equipos que se haya obtenido.
• toString: Devuelve “Equipos equilibrados”
Test

1. Haz un test que haga estos pasos:

• Crea una lista con estos objetos Alumno:

Pérez González, Antonio, exp 3


Gómez Pérez, Isabel, exp 2
Ruíz Ruíz, Jorge, exp 3
Ballesteros, Tony, exp 2
Smith Pérez, Ana, exp 1
Martínez Martínez, Juan, exp 1

• Obtén un FormadorEquiposEquilibrados, llama al método formarGrupos para hacer


grupos de 3 personas y haz las siguientes comprobaciones:

◦ La lista de grupos que devuelve el método formarEquipos tiene 2 elementos.


◦ Cada uno de los equipos de la lista tiene 3 miembros
◦ Cada equipo tiene un total de 6 puntos de experiencia
ControladorFrmGeneradorEquipos

Esta clase es la pantalla principal del programa.

Elementos destacados:

• lstAlumnos: Es un List con los objetos Alumno que se cargan de un archivo txt.
• spnTamGrupo: Es un Spinner con el número de alumnos que forman un grupo.
• cmbMetodosFormacionEquipos: Es un ComboBox con objetos de tipo
MetodoFormacionEquipos que sirven para formar equipos de alumnos.
• txtEquipos: Es un TextArea donde se pondrán los equipos formados.
• btnFormarEquipos: Botón que al ser pulsado forma equipos y añade el resultado a
txtEquipos.
• Menu: En la parte superior hay un menú con las opciones “abrir”,”guardar” y “salir”.
◦ Al pulsar “abrir” se llamará al método cargarListaAlumnos
◦ Al pulsar “guardar” se llamará al método guardarEquipos
◦ Al pulsar “salir” el programa finalizará.

Métodos:

• initialize: Llama al método cargarComboBoxMetodosFormacionEquipos y centra la


ventana en la pantalla.
• cargarListaAlumnos: Este método hace esto:
◦ Abre un FileChooser que nos permite elegir un archivo txt con alumnos.
◦ Usa la clase CargadorAlumnos para obtener un List<Alumno> con los alumnos
de ese archivo.
◦ Rellena la lista de alumnos con esos objetos Alumno.
• cargarComboBoxMetodosFormacionEquipos: Usa la interfaz
MetodoFormacionEquipos para obtener todos los métodos de formación de
equipos disponibles y añadirlos al cmbMetodosFormacionEquipos.
• guardarEquipos: Hace esto:
◦ Abre un FileChooser que nos permite elegir un archivo txt para guardar los
equipos creados.
◦ Coge el texto que hay en txtEquipos y lo guarda en el archivo.
◦ En caso de error, se mostrará una ventana emergente informando del error.
• generarEquipos: Hace esto:
◦ Coge el método de formación de equipos seleccionado en
cmbMetodosFormacionEquipos.
◦ Obtiene un List<Alumno> con todos los alumnos seleccionados en lstAlumnos
◦ Obtiene un SelectorCapitan de acuerdo al botón de radio seleccionado en la
pantalla (si está elegido sin capitán, se dejará vacío, con cuidado de no producir
NullPointerException más adelante).
◦ Pasa la lista anterior al método de formación de equipos y obtiene un
List<Equipo>
◦ Recorre la lista anterior y por cada Equipo recorrido hace esto:
▪ Le pone un capitán, de acuerdo al SelectorCapitan obtenido anteriormente.
▪ Añade a txtEquipos lo que nos devuelve el método toString del equipo

También podría gustarte