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 poziomu
i 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 poziomu
zachowaj losową kolejność z punktu 1. - Pierwsza kolejka
- wylosuj
kolejność grup
, - do pierwszej grupy w
kolejności grup
przypisz osobę z pierwszej pozycji naliście bazowej
, do następnych grup wkolejności grup
przypisz po jednej osobie, kolejno pobranej zlisty bazowej
, - dla każdej grupy policz aktualną
sumę punktów
osó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ść grup
w przypadku równejsumy punktów
(aby jako pierwsza pobierała kolejną osobę zlisty bazowej
grupa aktualnie "najsłabsza"), - tak jak powyżej, do pierwszej grupy w
kolejności grup
przypisz osobę z pierwszej pozycji naliście bazowej
, do następnych grup wkolejności grup
przypisuj następne wolne osoby zlisty bazowej
, - tak jak powyżej, dla każdej grupy policz aktualną
sumę punktów
osó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ów
wszystkich 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 [email protected]: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).