Podręcznik
Wymagania zaliczenia
Wersja podręcznika: 1.0
Data publikacji: 01.01.2022 r.
Wykłady
W1…WN, odpowiadające w sumie ok. 10-12 godz. standardowego wykładu
1. Programowanie w ograniczeniach
1.4. Rodzaje ograniczeń
Rodzaje ograniczeń
Można zauważyć, że rozważając różne problemy pewne rodzaje ograniczeń występują częściej. Dlatego często wyróżnia się specjalne typy ograniczeń, szczególnie jeżeli dla nich można dostarczyć specjalne, bardzie efektywne, metody obsługi, w szczególności redukcji domen i eliminacji zmiennych. Przytoczymy teraz często występujące ograniczenia:
- ograniczenia logiczne np. wynikanie, np. jeżeli x=1 => y=0
- alldifferent (x,y,z) (w skrócie alldiff) - każda zmienna musi przyjąć inną wartość
- circuit(succ) - wartości w succ muszą tworzyć cykla Hamiltona, czyli sekwencja 1, succ[1], succ[succ[1]], ... tworzy pętlę 1,...,n
- distribute(car, value, base) - liczba wystąpień value[i] w base musi wynieść card[i]
- pack - upakowuje elementy w pojemniki o ograniczonych pojemnościach
- lexicographic - wymusa leksykograficzny porządek pomiędzy podzbiorami zmiennych decyzyjnych
- ograniczenia dotyczące sekwencji, np. before, prev, first/last, noOverlap
Przykład modelowania
Jako przykład rozważym problem komiwojażera. Niech \(c_{ij}\) będzie odległością pomiędzy miastami \(i\) oraz \(j\). Zadanie polega na znalezieniu najkrótszej drogi, która odwiedza wszystkie miasta dkoładnie jeden raz. Jedno ze standardowych sformułowań programowania całkowitoliczbowego przyjmuje następującą postać:
\(\min \sum_{ij} c_{ij}x_{ij}\)
przy ograniczeniach
\(\sum_ix_{ij}=1 \quad \forall j\)
\(\sum_jx_{ij}=1 \quad \forall i\)
\(\sum_{i\in V}\sum_{j\in W}x_{ij} \geq 1, \quad \forall V,W\subset\{1,\ldots,n\}, V\cap W=\emptyset\)
\(x_{ij} \in \{0,1\}\)
gdzie, \(x_{ij}\) przyjmuje wartość 1, jeżeli miasto \(j\) jest odwiedzane bezpośrednio po mieście \(i\).
Trzecie ograniczenie odpowiada za eliminację podcykli.
Przykładowe sformułowanie problemu jako zadnia programowania w ograniczeniach może być następujące:
\(\min \sum_k c_{y_k,y_{k+1}}\)
przy ograniczeniach
\(alldiff(y_1, \ldots, y_n)\)
\(y_k \in \{1,\ldots, n\}\)
gdzie \(y_k\) przyjmuje wartość równą numerowi miasta odwiedzanego w \(k\)-tej kolejności. Pierwsze ograniczenie \(alldiff\) oznacza, iż każda zmienna musi przyjąć inną wartość.