Podręcznik
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
będzie odległością pomiędzy miastami
oraz
. 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ć:
przy ograniczeniach




gdzie,
przyjmuje wartość 1, jeżeli miasto
jest odwiedzane bezpośrednio po mieście
.Trzecie ograniczenie odpowiada za eliminację podcykli.
Przykładowe sformułowanie problemu jako zadnia programowania w ograniczeniach może być następujące:

przy ograniczeniach


gdzie
przyjmuje wartość równą numerowi miasta odwiedzanego w
-tej kolejności. Pierwsze ograniczenie
oznacza, iż każda zmienna musi przyjąć inną wartość.