Problém rozdělení dětí do skupin dle preferencí rubrika: Programování: PHP

1 martin.lutonsky
položil/-a 14.12.2016

Zdravím,
děláme systém v PHP pro agenturu, která pořádá zájezdu pro děti. Tzn. například každou sobotu jedou dva autobusy špuntů, X instruktorů a učí je celý den lyžovat.

Na pořadu dne mámě problém, jak rozdělit děti do skupin po 4 dětech postupně podle daných preferencí a poté tyto skupiny podle jiných preferencí přiřadit instruktorovi.

Preference skupin dětí jsou např. (postupně od nejdůležitější po méně důležité):

  • skupina nesmi byt (pokud to jinak nejde) rozdělena ve vícero autobusech
  • děti ve skupině musí mít stejnou pokročilost v daném sportu
  • děti minule jely spolu
  • podobný věk dětí ve skupině
  • děti chodí do stejné školky

Tzn. idea je taková, že množinu např. 80 dětí rozdělím na dvě množiny pro autobus A a B, ty množiny dálě dělím na menší podle preferencí (tzn. následně např. obě množiny rozdělím na měnší množiny podle pokročilosti ve sportu na X skupin P1 až PX). Takto množiny dělím, dokud nezískám množiny po 4 dětech - pak vím, že už je ok a mohu ji "uzamknout" - tzn. vím, že s dětmi v ní již nebudu manipulovat. Větší/menší množiny dělím podle preferencí/přerozděluju zpětně dle vyšších preferencí do neúplných skupin atd.

Na vstupu tedy dostáváme množinu dětí a vozidel se všemi daty, které jsou potřeba (známe pokročilost dítěte ve sportu, věk, ve které skupině bylo a s kým minule,...)

Přiřazování skupin instruktorům už je ekvivalent, jen s jinými preferencemi (zkušenost instruktora ve sportu by neměla být menší než zkušenost děti ve skupině, instruktor by měl učit děti, které učil i minule apod.).

Samozřejmě nechceme znovu vynalézat kolo, čili můj dotaz zní: nemátě někdo zkušenost s nějakou knihovnou či nástrojem, který náš problém nějak elegantně řešil? Popřípadě jaký byste doporučili?

Nepotřebujeme žádnou velkou super škálovatelnou architekturu, rozdělení do skupin bude probíhat jednou denně, kdy se bude zpracovávat např. 5 zájezů, kde v rámci každého jede 40-120 dětí. Tedy suma rozdělovaných dětí je někde kolem několika stovek denně.

Díky!

Komentáře

  • dzejkob : No - přijde mi to tak konkrétní, že knihovna či nástroj, který problém elegantně řeší, je jednoduše řečeno programovací jazyk. Z toho co je nastíněno to vypadá i poměrně jednoduše - a s danými objemy dat a frekvencí je v podstatě úplně jedno, zda ten kód bude efektivní, takže si s tím může pohrát kdokoliv. Jenom to vypadá, že k těm kritériím bude třeba přistupovat specificky - např. umístění skupin do autobusu je nesmysl dělat první, protože to nijak nesouvisí se splnitelností dalších kritérií - a pokud skupiny mají fixní velikost, tak to nesouvisí vůbec s ničím, protože vždy je bude třeba vtěsnat do autobusů tak, aby zůstaly celé. Zbytek je o nějakém průniku vícero množin. Kdyby to bylo lépe a zajímavěji specifikováno, tak by to bylo hezké cvičení algoritmizace. 15.12.2016
odkaz
7 harrison314
odpověděl/-a 15.12.2016
 
upravil/-a 15.12.2016

Toto je pekny priklad pre K-means, (kde K je pocet deti vydeleny 4), tento algoritmus je specificky tym, ze ho mas nakodeny rychlejsie, ako si vygooglis kniznicu :D
Len ovaz jednotlive parametre a bude to.

Komentáře

  • junior779 : "richlejsie" robis Slovakom hambu :-) 15.12.2016
  • jchorvat : @junior779 "hambu" robis Slovakom hanbu :-) 19.12.2016
  • Kit : Tohle vypadá jako užitečný a rychlý algoritmus. Stačí vytvořit pětirozměrný prostor, do něho nasázet děti podle kritérií a vygenerovat centroidy. 19.12.2016
  • harrison314 : Ved o tom hovorim, je to primitivne, nakodene za 10 minut a robi to presne to, co je ocakavane v zadani. 19.12.2016

Pro zobrazení všech 8 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.