Aplikacja webowa, która pozwala podzielić listę osób na grupy. Osoby mają różny poziom zaawansowania. Siła otrzymanych grup powinna być możliwie wyrównana.
Aplikacja ma jedną funkcję - generowanie grup. Może być przydatna do transmisji on-line losowania grup, aby wszystkie zainteresowane osoby mogły uczestniczyć w losowaniu.
Inspiracją do powstania projektu był podział 20 osób uczących się Javy na 4 zespoły https://www.facebook.com/groups/350299415891965/.
Założenie:
Algorytm powinien działać dla dowolnej liczby osób o różnych poziomach zaawansowania i losowo dzielić uczestników na grupy o jak najbardziej wyrównanej sile.
Dane wejściowe:
- lista poziomów zaawansowania, z przypisanym
numerem poziomui jegowartością punktową - lista osób z określonym poziomem zaawansowania
- lista docelowych grup (pustych)
Realizacja:
- Dla każdego poziomu utwórz listę osób znajdujących się na tym poziomie zaawansowania. Pomieszaj losowo osoby wewnątrz każdego poziomu.
- Ułóż wszystkie osoby w jedną
listę bazową, malejąco wedługnumerów poziomów. W przypadku osób o równymnumerze poziomuzachowaj losową kolejność z punktu 1. - Pierwsza kolejka
- wylosuj
kolejność grup, - do pierwszej grupy w
kolejności grupprzypisz osobę z pierwszej pozycji naliście bazowej, do następnych grup wkolejności grupprzypisz po jednej osobie, kolejno pobranej zlisty bazowej, - dla każdej grupy policz aktualną
sumę punktówosób do niej należacych.
- wylosuj
- Druga kolejka
- tak jak powyżej, wylosuj
kolejność grup, - posortuj grupy rosnąco, według
sumy punktów, zachowując wylosowanąkolejność grupw przypadku równejsumy punktów(aby jako pierwsza pobierała kolejną osobę zlisty bazowejgrupa aktualnie "najsłabsza"), - tak jak powyżej, do pierwszej grupy w
kolejności grupprzypisz osobę z pierwszej pozycji naliście bazowej, do następnych grup wkolejności grupprzypisuj następne wolne osoby zlisty bazowej, - tak jak powyżej, dla każdej grupy policz aktualną
sumę punktówosób do niej należacych.
- tak jak powyżej, wylosuj
- Powtarzaj drugą kolejkę, aż do pobrania wszystkich osób z
listy bazowej.
Dane wyjściowe:
- dla każdej grupy lista wylosowanych osób
- dla każdej grupy
suma punktówwszystkich osób w grupie
Aplikacja jest dostępna online https://group-mixer-r.herokuapp.com/
Uruchomienie jako projekt Maven:
Wpisz w IDE:
git clone https://github.com/rengreen/group-mixer.git
lub jeśli używasz SSH:
git clone git@github.com:rengreen/group-mixer.git
Dane wejściowe są pobierane z plików json. Pliki z danymi znajdują się katalogu src/main/resources/static/json/. W kolejnej wersji planowane jest wprowadzanie i edycja danych w GUI.
Aby podać swoje dane zmodyfikuj pliki wejściowe. Obecnie aplikacja działa dla prawidłowych danych wejściowych. Szczegółowe komunikaty informujące o podaniu nieprawidłowych danych wejściowych pojawią się w kolejnej wersji.
Informacje o plikach wejściowych:
Poziomy: src/main/resources/static/json/levels.json
przykładowy plik:
[
{
"value": 1,
"name": "1",
"weight": 1
},
{
"value": 2,
"name": "Juniorki",
"weight": 6
}
]value - unikalna liczba, określająca kolejność poziomów,
name - dowolna nazwa (wyświetlana na ekranie),
weight - liczba punktów, czyli waga poziomu - celem algorytmu jest stworzenie grup o równej lub podobnej liczbie punktów; wartość weight nie musi być unikalna.
Jeżeli poziomów jest więcej niż 10 należy zdefiniować dodatkowe kolory w pliku css. W przeciwnym razie wszystkie poziomy powyżej 10 będą się wyświetlały w kolorze domyślnym.
Osoby: src/main/resources/static/json/persons.json
przykładowy plik:
[
{
"name": "Anna Nowak",
"level": 1
},
{
"name": "osoba 2",
"level": 2
}
]name - dowolna nazwa (wyświetlana na ekranie),
level - liczba określająca poziom, zdefiniowana w polu value w pliku levels.json.
Grupy: src/main/resources/static/json/teams.json
przykładowy plik:
[
{
"name": "Gamerki"
},
{
"name": "Heroski"
}
]name - dowolna nazwa (wyświetlana na ekranie).