Nejste přihlášen/a.

Přihlásit se do poradny

 

Záhada kombinace párů členů týmu

Od: robertm* odpovědí: 12 změna:

Máme 10 osob v týmu a potřebujeme je rozdělovat do pěti dvojic, které budou společně plnit úkoly. Po dobu 9 dní bude probíhat střídání dvojic tak, že každý den bude povinně nakombinováno 5 dvojic a žádný den se nesmí opakovat dvojice, která již byla společně v některém z předchozích dnů. Cílem je, aby se postupně vystřídali všechny možné kombinace dvojic. Potřebuji vytvořit rozvrh pro tento scénář. Můžete prosím pomoci? Smekám klobouk před tím, kdo tento úkol vyřeší :)

 

 

12 odpovědí na otázku
Řazeno dle hodnocení

 

 

hodnocení

3x
avatar gilhad

Tady máš jeden možný scénář

01-23-45-67-89-
02-13-46-58-79-
03-12-47-59-68-
04-15-26-39-78-
05-14-27-38-69-
06-17-28-35-49-
07-18-29-34-56-
08-19-24-36-57-
09-16-25-37-48-

a tady program, který ho vypočítal

#!/usr/bin/python -u
days=[]
def pridej(s, n, tab): # s string, n prvni nepouzite cislo
if "%d"%n in s:
return False
for i in range(n+1,10):
if not "%d"%i in s:
sx="%d%d-"%(n,i)
if [ d for d in days if sx in d]:
continue
s2="%s%d%d-"%(s,n,i)
if len(s2)==15:
if not s2 in days:
print(s2)
days.append(s2)
return True
else:
for j in range(n+1,9):
if pridej(s2,j,tab+" ."):
return True

for a in range(1,10):
if a == 1:
pridej("0%d-"%a,2,"")
else:
pridej("0%d-"%a,1,"")

*********************************

Jak se tu udělá kód, mě to vyházelo všechna odsazení, což v pythonu celkem vadí ...


doplněno 30.08.23 19:19:

lidi značím číslovkama "0"-"9" protože se mi tak snadno procházejí

Bez Újmy Na Obecnosti (=BÚNO) jde při zápisu lidi ve dvojicích mít seřazené vzestupně (je fuk, jak v té dvojici stojí, takhle je snadno můžu hledat)

BÚNO jde mít dvojice seřazené podle numerické hodnoty

dvojice zapisuju s oddělovačem, takže při hledání v řetezci 01-23-45-67-89- mi to (správně) nenajde dvojici 12

Důsledek je, každý řetězec začíná dvojící "0"něco a druhá dvojice začíná buď 1, nebo pokud něco byla 1, tak začíná 2

Odsazení je v pythonu úroveň vnoření, stejně jako v C to jsou { ... } a v Pascalu begin ... end

days je list, kam dávám už nalezené dny. Používám ho abych zkontroloval, že dvojice nebyla ještě použitá. Mohl bych ho na konci vypsat, ale ladilo se mi to líp s průběžným vypisováním a pak už je to zbytečné opakovat

pridej je funkce, která k rozpracovanému řetězci přidává další dvojice

první parametr s je uvažovaný řetězec, druhý n je číslo, od kterého se mají zařít hledat nové dvojice. Třetí parametr (tab) není potřeba, používal jsem ho při ladění pro odsazování tisku

pridej projde možné kandidáty na další dvojici ("n"něco) a pro každého slibného se zavolá znovu pro doplnění řetězce s tímto kandidátem (s2)

něco musí být větší než n, protože tak je řadím

Pokud najdu vhodný řetězec o délce 15 (5 dvojic s oddělovači), tak ho vypíšu, přidám k days, vrátím True a končím včetně všech volajících, protože řetezec se stejnou první dvojicí už by znamenal opakování, takže není potřeba dál zkoumat tuto větev

Pokud je n už obsaženo v řetězci s, tak pridej končí hned, protože by se ten člověk jinak počítal dvakrát. Je to jednodušší testovat v té funkci, než při generování kandidátů.

range(i,j) vrací čísla menší než j , počínaje i, tedy range(5,10) vrací 5,6,7,8,9 a smyčka for i in range(n+1,10) je tedy projde (tady bylo n=4, n+1=5)

sx je nová dvojice (n,i) [ d for d in days if sx in d] vrací všechna d taková, že d je v days (čili už nalezený den) a sx je v tom d (čili už je ta dvojice použitá). Jestliže se takový den najde, tak to není vhodný kandidát a continue pokračuje dalším cyklem smyčky (tady for i in ...)

return končí funkci a vrací hodnotu (a chybí mi tam return False na konci té funkce, ale buď to tam nedošlo, nebo se prázdná návratová hodnota bere jako False, takže mi to nevynadalo)

Hlavní program začíná po skončení definice funkce cyklem for a in range

Celé je to psané dost humpolácky a jednoduše, protože 10 je malé číslo, rekurze do úrovně 5 a dvě, nebo tři vnořené smyčky prostě znamenají nějaké stovky nebo tisíce průchodů a pro jednorázové použití to dnešní počítače s téměř neomezenou pamětí a rychlostí (pro tyto účely) zvládnou rychle (u mě za 0.011 sec)

A celé je to jen rozepsání toho zadání, když člověk je zvyklý programovat, používat rekurzi a zná trochu prostředky svého jazyka

Záhada kombinace párů členů týmu
robertm*
hodnocení

Díky za skvělé vyřešení. Jak jsem slíbil, smekám klobouk pře tvým rychlým řešením :)

Já moc programovat neumím a skládal jsem to ručně. Ty samotné dvojice je celkem lehké identifikovat, ale to vytvoření matice mi fakt nešlo.

Python neumím, jen trochu Visual Basic v Excelu a Excel vzorečky. Existuje nějaký software na převedení pythonu do VB, abych mohl kódu lépe rozumět?

Díky moc

robertm*
hodnocení

díky za obrázek, tak je kód mnohem srozumitelnější...

 

hodnocení

1x
avatar herd

10 osob ti dá (10^2-10)/2=45 dvojic. To je fakt z zadaných údajů (10 osob) a omezení nesmět se střídat..
;) A hle ono ti to krásně na 9dní vyjde, že každý den bude pět dvojic (45/9). TO sedí skoro jak šťastný konec pohádky nebo školní úlohy

robertm*
hodnocení

Jo, to vím, pěkně to sedí, ale napsat ten scénář, aby byly splněny všechny zadané podmínky, jsem nedokázal. Pro prvních 7 dní bez potíží a ten 8. a 9. den už mi do scénáře nejde zadat. Proto se radím s moudřejšími :)

 

teflon
hodnocení

0x

Připadalo mě to jako otázka ideální pro LLM a protože matematiku neovládám tak jsem se zeptal ještě na doplňující otázky. Snad to pomůže:

Zde je jeden z možných způsobů, jak vytvořit rozvrh pro vaši situaci:

Prvně si pojďme zjistit, kolik celkově různých kombinací dvojic můžeme získat z 10 osob. K tomu můžeme použít vzorec pro kombinace bez opakování:

C(10, 2) = 10! / (2! * (10 - 2)!) = 45 kombinací dvojic

Máme celkem 45 různých dvojic. Nyní chceme tyto dvojice rozdělit do 9 dní tak, aby se neopakovaly. Pro každý den budeme vybírat 5 dvojic.

Dvojice budeme označovat jako A1, A2, B1, B2, atd.

Zde je jeden z možných rozvrhů:

Den 1:

A1, A2, B1, B2, C1

Den 2:

A3, B3, C2, D1, D2

Den 3:

A4, C3, D3, E1, E2

Den 4:

A5, D4, E3, F1, F2

Den 5:

A6, E4, F3, G1, G2

Den 6:

A7, F4, G3, H1, H2

Den 7:

A8, G4, H3, I1, I2

Den 8:

A9, H4, I3, J1, J2

Den 9:

A10, I4, J3, B3, B4

Tento rozvrh zajišťuje, že každý den jsou vybrány 5 unikátních dvojic a žádná dvojice se neopakuje v průběhu 9 dní. Je třeba si dát pozor na to, že se některé dvojice mohou opakovat přes více dní (např. B3 je ve dnech 2 a 9), což je třeba brát v úvahu, pokud by to mělo nějaký vliv na vaši situaci.

Co znamená C() a vykřičník za číslem?

Symbol "C()" se v kombinatorice používá k označení binomického koeficientu. Binomický koeficient C(n, k) udává počet způsobů, jakými lze vybrat k prvků ze skupiny n prvků, a to bez ohledu na pořadí. Vyjádřeno matematicky:

C(n, k) = n! / (k! * (n - k)!)

Kde "n!" znamená faktoriál čísla n, což je součin všech celých čísel od 1 do n.

Vykřičník za číslem je běžně používaný způsob značení faktoriálu. Například "n!" znamená faktoriál čísla n.

V mé předchozí odpovědi jsem použil binomický koeficient pro výpočet počtu různých dvojic z daného počtu osob, což bylo zavádějící. Omlouvám se za to. Pro správný postup vytvoření rozvrhu potřebujete spíše permutace než kombinace.

Pokud chcete, mohu se pokusit znovu vytvořit správný rozvrh na základě permutací a podmínek, které jste uvedl.

robertm*
hodnocení

V navržené matici pro 1.den (A1, A2, B1, B2, C1), pokud ji správně chápu, jsou nekteří členové týmu ve více dvojicích zároveň a jiní nejsou v žádné dvojici. Potřebujeme, aby každý den byl každý člen týmu v jedné unikátní dvojici, která se už další den nebude opakovat.

Doufám, že si rozumíme :)

k2

Toto doufam nebylo mysleno vazne...

robertm*
hodnocení

Nerozumím, co nemělo být myšleno vážně. Jsem ze starší generace a potřebuji zpětnou vazbu více polopaticky...

k2

@robertm:To nebylo na Vas, ale na ten blabol od @teflon. Nez jsem to dopsal, tak se muj prispevek zaradil pod Vas.

robertm*
hodnocení

díky, vedení obnoveno, už na něm nesedím ...

Že umělák dokáže docela přesvědčivě halucinovat a že je pro něj důležitější, aby odpověď zněla hezky, než aby byla správná, nebo aspoň v nějakém vztahu k realitě, to je už dávno známá věc a kdokoli se s ním chvilku bavil to přece musí jasně vidět, pokud není totálně naivní důvěřivec. *tuc*

On používat jde docela dobře, ale musí se vědět, na co se hodí líp, na co hůř a člověk mu nesmí věřit ani slovo, které by si neověřil jinde.

Já na něj mívám v průměru pár dotazů denně a ačkoli málokdy odpoví zcela správně, tak už vím, jak jeho fantasie použít jako odrazový můstek ke skutečným odpovědím, takže mi slouží docela dobře, i když strašně kecá *smich*

 

 


 

 

 

Přihlásit se k odběru odpovědí z této otázky:

Neneseme odpovědnost za správnost informací a za škodu vzniklou jejich využitím. Jednotlivé odpovědi vyjadřují názory jejich autorů a nemusí se shodovat s názorem provozovatele poradny Poradte.cz.

Používáním poradny vyjadřujete souhlas s personifikovanou reklamou, která pomáhá financovat tento server, děkujeme.

Copyright © 2004-2025 Poradna Poradte.cz. Všechna práva vyhrazena. Prohlášení o ochraně osobních údajů. | [tmavý motiv]