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.
Zobrazeno 12 zpráv z 12.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.