Prerekvizity: [L1.1], [L1.7], [L1.8]. Wedding plan je ostrá zkoušková úloha: padla 21.06.2021 (za 6 bodů), v roce 2023 a 25.05.2026 (za 7 bodů) — v predikovaném slotu 1, který padá ve 100 % termínů. Všechny díly už znáš; dnes je poprvé poskládáš dohromady sám, od prázdného papíru po kompletní model.
Zkouškové zadání (celé přesně v úloze T01 níže) je jeden hutný odstavec. První dovednost: rozsekat ho na věty a ke každé říct, kterou techniku vyžaduje. Teprve pak se píší proměnné a omezení.
Čtyři díly — a žádný z nich není nový. Celé „vyvrcholení“ je o disciplíně skládání.
Jen dvě sady:
Počet hostů $N = \sum_{i=1}^{n} x_i$ je jen zkratka za lineární výraz, ne nová proměnná. Funkce $br$, $gr$, čísla $m, p_1, p_2, p_3, B, D_{max}, n$ jsou parametry zadání — solver o nich nerozhoduje. Toto rozlišení v odpovědi explicitně uveď (sekce „parameters“ vs. „variables“); hodnotitel za ni dává body.
Recept z [L1.7] beze změny ($M = n$ stačí, protože $0 \le N \le n$; triviální meze $N \ge 0$ a $N \le n$ netřeba psát):
$$y_1 + y_2 + y_3 = 1$$ $$N \le 9 + n(1 - y_1)$$ $$N \ge 10 - n(1 - y_2), \qquad N \le 19 + n(1 - y_2)$$ $$N \ge 20 - n(1 - y_3)$$Zkontroluj, že žádnému intervalu nechybí netriviální mez — za neomezený třetí cenový případ se na termínu 21.06.2021 strhávaly 2 body (ve studentově formulaci nebyla jeho horní mez triviální).
Platí se jídlo $m$ za každého pozvaného hosta a cena pronájmu vybraného intervalu:
$$m \sum_{i=1}^{n} x_i \;+\; p_1 y_1 + p_2 y_2 + p_3 y_3 \;\le\; B.$$Pronájem je za místo, ne za hlavu — nenásobí se počtem hostů. A díky $\sum_k y_k = 1$ se z $\sum_k p_k y_k$ „vytáhne“ přesně jedna cena.
Počty pozvaných z obou stran jsou lineární výrazy $\sum_i gr(g_i)\,x_i$ a $\sum_i br(g_i)\,x_i$. Podmínka $|a - b| \le D_{max}$ = dvě nerovnosti [L1.8]:
$$\sum_{i=1}^{n} gr(g_i)\,x_i - \sum_{i=1}^{n} br(g_i)\,x_i \;\le\; D_{max}$$ $$\sum_{i=1}^{n} br(g_i)\,x_i - \sum_{i=1}^{n} gr(g_i)\,x_i \;\le\; D_{max}$$Jedna nerovnost nestačí — hlídala by jen jeden směr převahy. V dochovaném ohodnoceném řešení hodnotitel přeškrtl první pokus, kde student omylem obě sumy sečetl (plus místo minus); správně je rozdíl, oběma směry.
Nerozbije — a právě proto je konstrukce přes rozdíl sum elegantní. Pozvaný host s $br(g_i) = gr(g_i) = 1$ přičte $x_i = 1$ do obou sum, takže v rozdílu $\sum gr\,x - \sum br\,x$ se vyruší. „Společný“ host nenaklání váhy na žádnou stranu, což přesně odpovídá smyslu spravedlnosti v zadání. (V kritériu se samozřejmě počítá jen jednou — je to jeden host $x_i$.) Tahle poznámka v závorce je v zadání schválně: testuje, jestli si model nezačneš zbytečně komplikovat, např. rozdělováním hosta na půlky.
Intuice celého modelu na konkrétních číslech ($m = 1$, $p_1 = 2$, $p_2 = 5$, $p_3 = 8$ — vše v tisících CZK, $n = 30$): celkové výdaje jsou $m \cdot N + p_k$ a kritérium tlačí $N$ doprava, dokud výdaje nenarazí na rozpočet $B$.
Na druhém schodu stojí $N$ hostů $N + 5$; rozpočet $20$ dovolí nejvýš $N = 15$ (výdaje $20 \le 20$), pro $N = 16$ už $21 > 20$. Optimum tedy uvázne uvnitř intervalu — meze intervalu a rozpočet se o $N$ přetahují a model to vybalancuje sám.
Pro $B = 13$: druhý schod začíná výdaji $10 + 5 = 15 > 13$, takže interval 2 je celý nedostupný a optimum je $N = 9$ za $9 + 2 = 11$ — konec prvního schodu. Všimni si „díry“: hostů 10–13 se nedočkáš, i kdyby na jídlo zbývalo, protože skokem na druhý schod zdraží pronájem. Přesně tohle chování po částech konstantní ceny model přes $y_k$ věrně kopíruje.
Hodnotitel boduje po částech — v dochovaném ohodnoceném řešení z 21.06.2021 jsou vidět dílčí body zvlášť za kritérium, za rozpočet, za podmínku $D_{max}$ i za sekci parametrů. Kompletní odpověď má čtyři bloky: objective (kritérium), constraints (omezení, ideálně s krátkým slovním komentářem, co která skupina dělá), parameters (co je dané) a variables (o čem se rozhoduje, s definicí významu). Chybějící blok = zbytečně ztracené půlbody.
“You are planning a wedding. There is a set of potential guests $G = \{g_1, g_2, \ldots, g_n\}$. You want to invite as many guests as possible; however, there are some constraints. A meal for a single guest costs $m$ CZK (Czech koruna). A price for renting a place differs, depending on the number of invited guests: for $[0, 9]$ guests, the price is $p_1$ CZK, for $[10, 19]$ guests, the price is $p_2$ CZK, and for $[20, n]$ guests the price is $p_3$ CZK. You have a $B$ CZK; this budget cannot be exceeded. Furthermore, for the sake of justice, the number of guests invited from the groom's side and the bride's side can differ by at most $D_{max}$. Assume functions $br : G \to \{0, 1\}$ and $gr : G \to \{0, 1\}$, where $br(g_i) = 1$ iff $g_i$ is from the bride's side, and $gr(g_i) = 1$ iff $g_i$ is from the groom's side. (Note that there might be some guest $g_i$ such that $br(g_i) = gr(g_i) = 1$.)
Design an ILP model deciding which guests will be invited while respecting all the constraints.”
Tuhle úlohu vyřeš celou NA PAPÍR — od prázdného listu, bez koukání do lekce ani do řešení, ideálně na čas (na zkoušce na ni budeš mít zhruba 15–20 minut). Pak mi pošli fotku — zkontroluju ti ji a vytknu chyby přesně jako hodnotitel.
Pozvat co nejvíc hostů z množiny $G$ ($n$ kandidátů). Výdaje: jídlo $m$ CZK za každého pozvaného + pronájem místa, jehož cena je po částech konstantní podle počtu pozvaných ($p_1$ pro 0–9, $p_2$ pro 10–19, $p_3$ pro 20–$n$). Celkem nejvýš $B$ CZK. Navíc se počty pozvaných ze strany ženicha (groom) a nevěsty (bride) smí lišit nejvýš o $D_{max}$; příslušnost ke stranám dávají parametry $gr(g_i), br(g_i) \in \{0,1\}$, přičemž host může patřit k oběma stranám zároveň. Výstup: ILP model rozhodující, kdo bude pozván.
Postupuj přesně podle kroků z výkladu: ① rozsekej zadání na věty a u každé si poznač techniku; ② proměnné — co je rozhodnutí ($x_i$, $y_k$) a co parametr ($m, p_k, B, D_{max}, br, gr, n$)? ③ omezení po blocích: výběr intervalu + vazby na $N = \sum_i x_i$ (jaké $M$ stačí?), rozpočet (co všechno se platí?), spravedlnost (kolik nerovností?); ④ kritérium. Nakonec projdi checklist z boxu „Kontrola před odevzdáním“.
Variables: $x_i \in \{0,1\}$, $x_i = 1$ ⟺ host $g_i$ je pozvaný; $y_1, y_2, y_3 \in \{0,1\}$, $y_k = 1$ ⟺ počet pozvaných padne do $k$-tého cenového intervalu. Zkratka $N = \sum_{i=1}^{n} x_i$ (lineární výraz, ne proměnná).
$$\begin{aligned} \max \quad & \sum_{i=1}^{n} x_i && \text{(as many guests as possible)} \\ \text{s.t.} \quad & y_1 + y_2 + y_3 = 1 && \text{(právě jeden cenový interval)} \\ & N \le 9 + n(1 - y_1) && \text{(interval 1: } N \in [0,9]) \\ & N \ge 10 - n(1 - y_2), \quad N \le 19 + n(1 - y_2) && \text{(interval 2: } N \in [10,19]) \\ & N \ge 20 - n(1 - y_3) && \text{(interval 3: } N \in [20,n]) \\ & m N + p_1 y_1 + p_2 y_2 + p_3 y_3 \le B && \text{(budget not exceeded)} \\ & \textstyle\sum_{i=1}^{n} gr(g_i)\,x_i - \sum_{i=1}^{n} br(g_i)\,x_i \le D_{max} && \text{(strany se neliší} \\ & \textstyle\sum_{i=1}^{n} br(g_i)\,x_i - \sum_{i=1}^{n} gr(g_i)\,x_i \le D_{max} && \text{ o víc než } D_{max}\text{)} \\ & x_i \in \{0,1\} \;\; \forall i \in 1..n, \qquad y_k \in \{0,1\} \;\; \forall k \in \{1,2,3\} \end{aligned}$$Parameters: $n \in \mathbb{N}^+$; $m, p_1, p_2, p_3, B \in \mathbb{R}^+$; $D_{max} \in \mathbb{Z}_0^+$; $br(g_i), gr(g_i) \in \{0,1\}$ pro $i \in 1..n$.
Komentáře: