This is an old revision of the document!


Constraint Programming: Basic Modelling Tenchniques

Ł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: mając dany graf, należy pomalować jego wierzchołki w taki sposób, by wierzchołki połączone krawędzią miały różne kolory.
  • Należy:
    1. Pobrać i rozpakować csp_coloring.zip.
    2. Przyjrzeć się modelowi csp_coloring.mzn.
    3. Korzystając z modelu spróbować rozwiązać problem kolorowania grafu zapisanego w csp_coloring_data.dzn.
      • W razie posiadania własnego modelu z pierwszego laboratorium, można go wykorzystać.
      • Istnieje szansa, że problem jest zbyt duży, żeby rozwiązać go w rozsądnym czasie.
    4. Plik csp_coloring_data2.dzn prócz informacji o grafie zawiera informacje o największej klice w grafie:
      • minColoursNumber - rozmiar największej kliki
      • maxClique - indeksy wierzchołków należących do największej kliki
    5. Zmienić model tak, aby wykorzystywał informacje z csp_coloring_data2.dzn.
    6. Spróbować rozwiązać problem opisany w csp_coloring_data2.dzn korzystając z nowego modelu.

Problem wielo-plecakowy

  • Problem: Problem plecakowy z kilkoma identycznymi plecakami zamiast jednego.
  • Należy:
    1. Zastanowić się, gdzie leży symetria w tym problemie.
    2. Pobrać i rozpakować csp_n_knapsack.zip
    3. Przyjrzeć się modelowi csp_n_knapsack.mzn.
      • Uwaga: ten model nie jest zbyt dobry; ma jedynie pokazać prostą technikę łamania niektórych symetrii.
      • Proszę zwrócić uwagę na zastosowane ograniczenie globalne at_most.
      • Model zawiera zdefiniowany predykat knapsack → warto wiedzieć, że coś takiego typu można modelować w MiniZinc. Pozwala to na większą modularyzację kodu.
    4. Uruchomić model z dołączonym plikiem:
      • Problem może być za trudny do rozwiązania.
      • Gdyby solver zwracał wynik “UNSATISFIABLE”, proszę spróbować użyć solvera “G12 fd” w zakładce “Configuration”
    5. Dodać do kodu łamanie symetrii korzystająć z ograniczenia globalnego ''lex_less''. Pozwala ona na wymuszenie kolejności plecaków. Plecaki muszą być zawsze uporządkowe leksykograficznie ze względu na swoją zawartość.
    6. Uruchomić nowy model z tymi samymi danymi.
    7. Czerpać zyski.

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.

  • Należy:
    1. Ściągnąć i zrozumieć model: csp_magic_series.zip
    2. Dodać do niego nadmiarowe ograniczenia. Podpowiedzi:
      • ile powinna wynosić suma magicznego ciągu?
      • ile powinna wynosić suma elementów magicznego ciągu, pomnożonych przez numery swoich indeksów (indeksując od 0)?
    3. Porównać działanie modelu z i bez dodatkowych ograniczeń na dłuższych ciągach.
    4. Czerpać zyski.

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.

  • Problem: ponownie problem n-hetmanów.
  • Należy:
    1. Odkopać model n-hetmanów z poprzednich zajęć. Ewentualnie pobrać ten: csp_n_hetmans.zip
    2. Dopisać do niego drugą możliwość wyboru zmiennych decyzyjnych i ograniczeń
      • Jeżeli ostatnio zmienne były indeksowane kolumnami i wskazywały na numer wiersza, należy dopisać model odwrotny.
    3. Powiązać ze sobą ograniczeniami oba zestawy zmiennych.
    4. Porównać działanie modelu pojedynczego i dualnego na problemach wielu hetmanów.
    5. Czerpać zyski z nabytej wiedzy, bowiem nowe solvery radzą sobie z n-hetmanami lepiej bez nadmiarowych ograniczeń. Niemniej w innych modelach technika ta może okazać się istotną optymalizacją.

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

  • Problem: już chyba każdy go zna.
  • Należy:
    1. Spróbować różnych adnotacji do przeszukiwania dla tego problemu, np.
      int_search(rows, input_order, indomain_min, complete);
      int_search(rows, input_order, indomain_median, complete);
      int_search(rows, first_fail, indomain_min, complete);
      int_search(rows, first_fail, indomain_median, complete);
    2. Zerknąć do dokumentacji flatzinc, rozdział 5.6.1. Przeczytać opisy różnych strategii i wypróbować jakąś szaloną.
    3. Porównać prędkość działania solvera n-hetmanów dla różnych strategii.
    4. Wyczerpać zyski z dzisiejszego laboratorium.
en/dydaktyka/csp/lab2.1489169652.txt.gz · Last modified: 2019/06/27 16:00 (external edit)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0