Diskuze: Algoritmus na rozřazení žáků do třídy
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 12 zpráv z 12.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
if (pocet_zaku > (kapacita_zaku = (otevreno_dnu_v_tydnu * (((otevreno_do - otevreno_od) * 60) / pocet_minut))))
printf("Pro %d zaku neni mozne najit termin a je treba je pro nadbytecnost vyhodit.\n", pocet_zaku - kapacita_zaku);
else printf("Denne muze navstivit mistnost misto hospody postupne az %d zaku.\n", ((otevreno_do - otevreno_od) * 60) / pocet_minut);
Díky Ale teď mi došlo, že jsem blbě napsal, co potřebuji.
Každý žák má volno pouze některé dny v týdnu a v určité hodiny. A já potřebuju zjistit, kdy tam který má jít.
Promiň, asi jsem tě tím zbytečně okradl o čas
To už tak triviální není, ale není to těžké. Je třeba hlídat dva stavy. Tím prvním je počet termínů pro každého žáka, na který se může dostavit. A tím druhým je počet žáků, kteří se mohou dostavit na daný termín. Prioritně pracuji s tím žákem, který má nejméně možných termínů. Stejně tak u termínů, pracuji s tím, na který se může dostavit co nejméně žáků. Pokud tedy mám žáka, který se může dostavit na jeden jediný termín, automaticky jej k tomuto termínu přiřazuji. Pokud mám termín, na který se může dostavit jeden jediný žák, automaticky jej k němu přiřazuji. V okamžiku, kdy přiřazuji žáka k nějakému termínu je třeba aktualizovat počet termínů u žáků, kteří se mohli na tento termín dostavit. Stejně tak pro každý termín je třeba aktualizovat počet žáků, na který se daný žák mohl dostavit. Žáka, který může kdykoli, s tím pracuji jako poslední, neboť ho lze použít jako výplň kamkoli. To jsou hlavní pravidla pro přiřazení žáka na konkrétní termín.
Dobře, díky Trochu mi to připomíná, když jsem jednou dělal algoritmus na sudoku Zkusím z toho nějak vyjít, mělo by to tak fungovat. Díky.
Jenom nevím, co budu dělat za předpokladu, že není ani na začátku žádný žák, který by měl nějaký termín 100% jistý. Taky by další problém mohl být, že časy nejsou rozfázované jako hodiny ve škole: Žák může být v místnosti 13:00-13:45 stejně jako 13:10-13:55 atd. Ale to už asi zvládnu vymyslet. Díky
Na sudoku jsem si také hned vzpoměl
S těmi minutami to bude trochu problém, pokud každý žák má různě
dlouhé časy. Pokud to zvládneš nějak formulovat jako exact cover problém,
tak by to jako sudoku mělo jít pomocí Knuthova algoritmu (https://en.wikipedia.org/…_Algorithm_X).
Přesně tak, určitá spojitost se sudoku tu je a to zejména ta část, kde není vždy na první pohled zřejmé, čím začít. Přemýšlíš nad tím velmi dobře, nestandartní časy to rozhodně trochu zkomplikují. Testů a kontrol tam bude opravdu dost, které bude třeba provádět při každé změně. Určitě si užiješ spoustu řazení či procházení celého pole. Ze začátku bude dobré stanovit si dobu v místnosti na nějakou rozumnou hodnotu a výpočet provést na menším počtu žáků. Tam se zamyslet nad tím proč právě tohoto žáka beru dříve než jiného a přiřazuji mu dostupný termín. Každopádně je to hodně zajímavá úloha, jejíž jádro můžeš následně použít v mnoha dalších aplikacích.
Tak pořád nevím, jakým způsobem bych to formuloval jako exact cover. Už nad tím nějakou chvíli dumám a jediné, co mě napadlo, je nějaký brute force algoritmus, podobně jako psal DarkCoder. Nenapadá tě, jakým způsobem by to šlo udělat pomocí exact cover? Stačí, kdybys mi mohl poradit jakým způsobem to mám brát, abych na to mohl použít ten knuthův algoritmus, zbytek zvládnu. Prostě mi přijde, že brutal force není optimální řešení a protože na dokončení mám čas do května a v posledních týdnech jsem udělal grafickou stránku věci, myslím, že není důvod se hned hrnout k brutal force, když existuje lepší řešení.
Díky, Petr
Ahoj, už je to dost dávno, ale zkusím se na to podívat Přes nový rok jsem v zahraničí, takže se k tomu dostanu až za pár dnů.
Dobře, díky Jenom bych byl rád, kdybys mi napsal, kdyby tě něco napadlo, nepotřebuji to nijak urgentně a kdyžtak to udělám hrubou silou, jenom sem se chtěl zeptat, jestli tě něco nenapadlo.
Ahoj, nemám teď čas to příliš studovat, ale poskytnu pár odkazů na stránky, kde je to dobře popsané a ze kterých jsem tehdy čerpal.
Dobře je exact cover popsaný například na stránkách:
http://garethrees.org/…-generation/ a
https://gieseanw.wordpress.com/…u-revisited/
Případně ještě přímo Knuthova práce, exact cover tam je ale popsaný
jen letmo:
https://www.ocf.berkeley.edu/…/0011047.pdf
nebo článek na Wikipedii (trochu teoretičtější):
https://en.wikipedia.org/…/Exact_cover
Snad Ti to pomůže
Zobrazeno 12 zpráv z 12.