Prerekvizity: [L1.1] Cílová funkce a základní omezení, [L1.4] Disjunkce a big-M. V [L1.8] jsi linearizoval $|a-b| \le D$ v omezení. Dnes se absolutní hodnota přestěhuje do objective function (cílové funkce) — a ukáže se, že záleží na tom, jestli minimalizuješ, nebo maximalizuješ.
Cvičení Lab 3 modeluje call center scheduling (rozvrhování směn call centra): $d_i$ je požadovaný počet lidí v hodině $i$, proměnná $x_j$ je počet osmihodinových směn začínajících v hodině $j$. Když jen minimalizuješ počet směn při pokrytí $\ge d_i$, vznikají v některých hodinách velké přebytky. Domácí úkol proto chce pokrýt poptávku co nejpřesněji:
$$\min \sum_{i=0}^{23} \Big| \, d_i - \sum_{j=i-7}^{i} x_{j \bmod 24} \Big|.$$Odchylka nahoru i dolů je špatně, proto absolutní hodnota. Jenže $|\cdot|$ není lineární funkce — do ILP ji přímo napsat nesmíš (v [L1.8] sis ověřil, že není lineární; její graf je „zlomené V“, ne přímka — uvidíš ho na obrázku níže).
$$|x| = \max\{x,\; -x\}.$$
Pro $x \ge 0$ vyhrává větev $x$, pro $x \le 0$ větev $-x$ — dohromady přesně „zlomené V“. Tohle je klíčové pozorování: absolutní hodnota je maximum lineárních funkcí, a s maximem už z [L1.8] umíme zacházet pomocnou proměnnou.
Stejně jako $h_{max}$ v [L1.8] — jednostrannými mezemi shora přes obě větve:
$$z \ge x, \qquad z \ge -x,$$a v kritériu minimalizuj $z$ místo $|x|$. Omezení zaručují jen $z \ge \max\{x, -x\} = |x|$ — tedy $z$ smí být i zbytečně velké. Ale minimalizace tlačí $z$ dolů, takže v optimu se $z$ „přilepí“ na nejnižší povolenou hodnotu: $z = |x|$. Přesně tahle dělba práce (omezení hlídají jeden směr, kritérium druhý) dělala v [L1.8] korektní i $h_{max}$.
Zdrojové cvičení formuluje obecný recept: pro součet absolutních hodnot zavedeš jednu proměnnou $z_i$ na každou absolutní hodnotu:
$$\min \sum_i |q_i - v_i| \quad \longrightarrow \quad \min \sum_i z_i \quad \text{s.t.} \quad q_i - v_i \le z_i, \;\; v_i - q_i \le z_i, \;\; z_i \ge 0.$$A hned k tomu dodává varování (citace): „Please notice that this transformation does not generally work if the absolute value was not originally in the objective function.“ Co se přesně rozbije?
Omezení dávají $z$ jen dolní mez — shora ho nedrží nic. Maximalizace tedy požene $z$ nahoru: buď do nekonečna (model je unbounded, neomezený), nebo na horní mez $z$, pokud nějakou deklaruješ. V obou případech $z \ne |x|$ — hodnota kritéria nemá s absolutní hodnotou nic společného. Trik $z \ge x$, $z \ge -x$ funguje jen ve směru, kterým kritérium tlačí — tj. jen pro minimalizaci.
Nepomůže. Meze na $x$ vůbec neomezují $z$ — to uteče stejně. A když omezíš i $z$ (třeba $z \le 5000$), solver prostě nastaví $z = 5000$ bez ohledu na skutečnou hodnotu $|x|$. Pouhé bounds (prosté meze na proměnné) vztah $z = |x|$ nevynutí nikdy — chybí omezení, které by $z$ shora přivázalo k větvím $x$ a $-x$. A „$z \le x$ NEBO $z \le -x$“ je disjunkce → binární přepínač + big-M [L1.4].
Pouhé meze na proměnných (např. $-5000 \le x \le 1000$) NESTAČÍ. U maximalizace se $z$ od $|x|$ „odlepí“ a uletí na svou horní mez — kritérium pak měří nesmysl. Zápis bez přepínače je u maximalizace přípustný jen tehdy, když je znaménko $x$ jednoznačně vynucené ostatními omezeními (pak ale žádné $z$ nepotřebuješ — viz níže). Nikdy nemodeluj $\max |x|$ bez znaménkového přepínače, dokud sis neověřil, že znaménko $x$ je vynucené.
Na zkoušce 2023 se maximalizovalo $|x_1| + |x_2|$ a v modelu zároveň platilo $x_1 = 4 x_4$ a $x_4 \ge 1$.
$x_4 \ge 1$ a $x_1 = 4x_4$ dávají $x_1 \ge 4 > 0$ — $x_1$ je v každém přípustném řešení kladné. Pak ale $|x_1| = x_1$ identicky a do kritéria napíšeš rovnou $x_1$, žádná pomocná proměnná, žádný trik. Pozor na správné čtení: vzorové řešení tady „prošlo“ kvůli vynucenému znaménku, NE proto, že by trik $z \ge \pm x$ u maximalizace fungoval díky mezím $-5000 \le x_i \le 1000$.
Symetricky: kdyby omezení vynucovala $x \le 0$, je $|x| = -x$. Vynucené znaménko = absolutní hodnota zmizí sama.
A když znaménko vynucené není (v téže úloze třeba u $x_2$)? Pak obecná $\max |x|$ potřebuje binární přepínač znaménka s big-M [L1.4]: binárka $s$ řekne, která větev maxima platí, a $z$ se přiváže shora:
$$z \le x + M(1-s), \qquad z \le -x + M s, \qquad s \in \{0,1\}.$$Maximalizace pak $z$ vytlačí přesně na $|x|$ (solver si zvolí $s$ podle znaménka $x$). Detailně si přepínač — spolu s poměrovou a max-z-více podmínkou z téže zkouškové úlohy — rozebereme v [L1.11] Poměrová a max-z-více podmínka; tady si ho vyzkoušíš v úloze T02.
“A call center needs to create a cyclic daily schedule (i.e., numbers of the shifts at particular hours are same on every day) of the shifts for its employees. Let $\mathbf{d}$ be a vector of a personnel demand in each hour during the day, i.e., $d_i$ is defined $\forall i = 0, 1, 2, \ldots, 23$. The personnel demand $d_i$ determines the minimal number of shifts (i.e., employees who will be assigned to these shifts) between $i$ and $(i+1)$ hour, e.g., $d_{10}$ expresses the minimal number of shifts running between 10 a.m. and 11 a.m. […] The shift may start at arbitrary full hour and its length is set to 8 hours. The ILP model of this problem is based on a variable $\mathbf{x}$ such that $x_i$ represents a number of the shifts starting at hour $i$.
To avoid a large surplus of shifts in comparison to the personnel demand, we modify our objective to find a daily schedule of shifts such that the difference of the personnel demand and its coverage is minimized, i.e., we try to cover the personnel demand as precisely as possible”
$$\min \sum_{i=0}^{23} \left| d_i - \sum_{j=i-7}^{i} x_{j \bmod 24} \right| \tag{1}$$Cyklický denní rozvrh směn: $x_j$ = počet osmihodinových směn začínajících v hodině $j$ (stejný každý den, hodiny počítáme modulo 24). Hodinu $i$ pokrývají směny, které začaly v hodinách $i-7, \ldots, i$ (mod 24). Cíl: minimalizovat součet absolutních odchylek mezi poptávkou $d_i$ a skutečným pokrytím — penalizuje se přebytek i nedostatek (tvrdé pokrytí $\ge d_i$ se v této verzi nevyžaduje).
Nejdřív bez absolutní hodnoty: jak vypadá lineární výraz „pokrytí hodiny $i$“? (Které směny v hodině $i$ ještě běží?) Pak: kolik absolutních hodnot kritérium obsahuje — a kolik pomocných proměnných $z_i$ tedy zavedeš? Nakonec: kterým směrem každé $z_i$ svážou omezení a kterým směrem ho tlačí kritérium? Ověř si, že jde o minimalizaci — jinak by trik nebyl validní!
Pokrytí hodiny $i$ označme $c_i = \sum_{j=i-7}^{i} x_{j \bmod 24}$ (lineární výraz v $x$). Na každou z 24 absolutních hodnot jedna pomocná proměnná $z_i$:
$$\begin{aligned} \min \quad & \sum_{i=0}^{23} z_i \\ \text{subject to:} \quad & d_i - \sum_{j=i-7}^{i} x_{j \bmod 24} \;\le\; z_i \qquad i \in 0..23 \\ & \sum_{j=i-7}^{i} x_{j \bmod 24} - d_i \;\le\; z_i \qquad i \in 0..23 \\ \text{variables:} \quad & x_{j \in 0..23} \in \mathbb{Z}_{\ge 0}, \qquad z_{i \in 0..23} \ge 0 \end{aligned}$$Komentáře:
“Consider the following mathematical model of four variables $x_1, x_2, x_3$ and $x_4$.
$$\text{Maximize } |x_1| + |x_2|$$subject to the restrictions
Formulate by the Integer Linear Programming.”
Maximalizace součtu dvou absolutních hodnot nad pěti druhy omezení: disjunkce „aspoň jedna ze dvou nerovností“ (1), podmínka s maximem (2), poměr dvou proměnných (3), celočíselnost (4) a prosté meze (5). Úkolem je čistá ILP formulace — nic se nepočítá.
Hlavní past je v kritériu: je to maximalizace, takže $z \ge \pm x$ z první části lekce použít nesmíš. Projdi proměnné v kritériu jednu po druhé: vynucují omezení (2), (3), (5) znaménko $x_1$? (Zkombinuj $x_1 = 4x_4$ s mezí na $x_4$.) A znaménko $x_2$? Pokud vynucené není, potřebuješ znaménkový přepínač. K podmínce (1): klasické big-M „aspoň jedna platí“ [L1.4] — a spočítej si poctivě, jak velké $M$ musí být, aby vypnutá nerovnost šla splnit při nejhorších hodnotách mezí (5). K (2): „$x_1$ je aspoň maximum dvou výrazů“ — co to říká o vztahu $x_1$ ke každému z nich? K (3): zlomek přepiš na rovnost (smíš — proč nehrozí dělení nulou?).
Proměnné: $x_1, \ldots, x_4 \in \mathbb{Z}$; $y \in \{0,1\}$ (přepínač disjunkce), $s \in \{0,1\}$ (znaménkový přepínač pro $x_2$), $z_2 \in \mathbb{Z}$ (role $|x_2|$). Konstanta $M = 11000$ (zdůvodnění níže).
$$\begin{aligned} \max \quad & x_1 + z_2 \\ \text{subject to:} \quad & x_1 + x_2 + x_3 + x_4 \le 1000 + M y \\ & 3x_1 + 5x_2 + x_3 + 2x_4 \le 500 + M (1 - y) \\ & x_1 \ge 2 x_2 \\ & x_1 \ge x_3 \\ & x_1 = 4 x_4 \\ & z_2 \le x_2 + M(1 - s) \\ & z_2 \le -x_2 + M s \\ & -5000 \le x_i \le 1000 \quad i \in \{1,2,3\} \\ & 1 \le x_4 \le 1000 \\ \text{variables:} \quad & x_{i \in 1..4} \in \mathbb{Z}, \;\; z_2 \in \mathbb{Z}, \;\; y, s \in \{0,1\} \end{aligned}$$Komentáře po podmínkách: