Spis treści

Lab CSP: Podstawowe techniki modelowania

Łamanie symetrii

Mówimy, że dany problem przejawia symetrię, jeśli istnieją dla niego rozwiązania symetryczne, tj. takie, które pomimo różnych wartości zmiennych decyzyjnych, są sobie równoważne. Przykładem może być problem kolorowania wierzchołków grafu przedstawiony na poprzednim laboratium — w każdym rozwiązaniu tego problemu możemy bez przeszkód zamienić ze sobą dwa kolory, wszystkie wierzchołki zielone przemalować na niebieskie, niebieskie zaś na zielone. Tak powstałe rozwiązania w niczym nie ustępuje oryginalnemu, niemniej istnienie symetrii niesie ze sobą jedną zasadniczą wadę, mianowicie ogromną przestrzeń rozwiązań, w której wiele stanów jest nadmiarowych. Usunięcie ich prowadzi do znacznie efektywniejszego przeszukiwania naprawdę interesujących rozwiązań.

Kolorowanie wierzchołków grafu

Problem wielo-plecakowy

Ograniczenia nadmiarowe

Jedną z podstawowych zasad programowania z ograniczeniami mówi, że ograniczenia są jak pieniądze — nawet jeżeli jest ich wystarczająco, przydałoby się więcej. Załóżmy, że udało nam się opisać wszystkie ograniczenia konieczne do opisu zadanego problemu (tj. spełnione tylko i wyłącznie przez rozwiązania prawidłowe oraz nie eliminujące żadnych rozwiązań prawidłowych); nie oznacza to wcale, że powinniśmy na nich zaprzestać. Każde kolejne ograniczenie, które dodaje jakąś informację, pozwala na zmniejszenie przestrzeni przeszukiwania — solver jest dzięki nim w stanie wcześniej „odciąć” gałęzie przeszukiwania niedające nadziei na przyszłość.

Magiczne ciągi

Jeżeli ktoś nie zrobił tego wcześniej, proszę przed przystąpieniem do ćwiczenia przynajmniej przeczytać opis problemu na stronie poprzedniego laboratorium.

Modele łączone - n-hetmans return!

Jedną z technik dodawania dodatkowych ograniczeń jest wykorzystanie kilku modeli tego samego problemu równocześnie. Pomimo tego, że wszystkie te modele mogą wskazywać na te same rozwiązania, zawarte w nich ograniczenia w innej kolejności zawężają dziedziny zmiennych. Kombinacja kilku modeli pozwala na ograczenie przestrzeni przeszukiwania z kilku „perspektyw” równocześnie.

Sterowanie przeszukiwaniem

O ile budowanie modelu w programowaniu z ograniczeniami jest zadaniem czysto deklaratywnym, często wiele zależy od sposobu, w jaki przeszukiwana jest przestrzeń rozwiązań. Istnieje wiele możliwych strategii, jednak w podstawowym przypadku można je zdefiniować poprzez dwa parametry:

  1. kolejność wyboru zmiennych - np. w kolejnym kroku solver ustali wartość zmiennej, która ma najmniejszą dziedzinę; ma największą dziedzinę; w kolejności zdefiniowania przez użytkownika, etc.
  2. kolejność wyboru wartości - po wyborze zmiennej, solver musi przypisać jej wartość z dziedziny, np. wartość najmniejszą, medianę dziedziny, wartość losową, etc.

Aby w MiniZincu wymusić na solverze strategię przeszukiwania, należy użyć tzw. adnotacji (ang. annotations). W ogólnym przypadku można je przypisywać do zmiennych podobnie jak inne parametry, ale najczęściej używa się ich przy specyfikacji celu, np.

solve :: int_search(array, first_fail, indomain_min, complete) satisfy;

daje solverovi znać, że tablica zmiennych array zawiera liczby i należy ją przeszukiwać, najpierw wybierając zmienne o najmniejszej dziedzinie (first_fail), następnie przypisywać im jak najmniejsze wartości (indomain_min) i przeszukiwać całą przestrzeń rozwiązań (complete).

Istnieją bardziej zaawansowane metody określania strategii w poszczególnych solverach, ale MiniZinc chcąc być językiem niezależnym od solvera nie może sobie na to pozwolić. Aktualnie konstrukcje pozwalające na pełną kontrolę nad procesem przeszukiwania działają jedynie dla solvera Gecode i wymagają dodania pewnych patchy do standardowej dystrybucji MiniZinc.

n-hetmans again