Spis treści

Lab CSP: Podstawowe problemy

W ramach laboratorium będziemy rozwiązywać standardowe problemy pojawiające się w literaturze dotyczącej programowania z ograniczeniami. Zaprogramowane modele będą następnie ulepszane poprzez stosowanie podstawowych technik modelowania w CSP.

Rozgrzewka

Problem n-hetmanów

Przykładowe złożone wyrażenie agregujące:
forall([tablica[i,j] = z | i,j in 1..M, z in 1..N where j < i])
lub równoważnie:
forall(i,j in 1..M, z in 1..N where j < i)(tablica[i,j] = z)

Kolorowanie grafów

%%%%%%%%%%%%%
% PARAMETRY %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Powinny być wczytane z pliku z danymi.%
% Traktujmy graf jako tablicę booli     %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
%%%%%%%%%%%%% 
% DZIEDZINA %        
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% miejsce na dziedzinę           %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%
% OGRANICZENIA %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
% miejsce na ograniczenia                    %
% podpowiedź:                                %
% - warto użyć if'a, by sprawdzić, czy dwa   % 
% wierzchołki są połączone                   %
% - liczba kolorów to może być maksymalny    %
% numer użytego koloru                       %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%
% CEL  %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Zminimalizuj użytą liczbę kolorów %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
solve minimize coloursNumber;

%%%%%%%%%%%%%%%%%%%%%%%%
% PRZYKŁADOWE WYJŚCIE  %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% - coloursNumber - liczba użytych kolorów  %
% - nodes - tablica wierzchołków grafu z    %
%           ich kolorami                    %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
output [show(coloursNumber), " colours\n",] ++
       [show(nodes[i]) ++ " " | i in 1..nodesNumber]

Definicja tablicy dwuwymiarowej booli:

array[1..2,1..3] of bool: bool_array = [|true, true, true | true, true, true|];

Konstrukcja warunkowa:

if bool then val1 else val2 endif

Operatory logiczne:

/\ -- i, \/ -- lub, != -- różne, == -- równe 

Globalne ograniczenia

Jedną z najprostszych metod tworzenia dobrego modelu w programowaniu z ograniczeniami jest korzystanie z gotowych globalnych ograniczeń. Dzięki wyspecjalizowanym algorytmom i implementacji są one w stanie lepiej wykorzystać informacje na temat struktury problemu od ograniczeń na pojedynczych zmiennych. Niektóre z globalnych ograniczeń są nawet w stanie zamodelować dynamiczne zachowanie systemu, np. ograniczenie cumulative uniemożliwia równoczesne wykorzystanie zasobu przez kilka zadań. W MiniZinc, aby korzystać z globalnego ograniczenia, należy je najpierw zaimportować, np. aby korzystać z ograniczenia cumulative należy wcześniej dopisać do kodu linijkę:

include "cumulative.mzn";

Sudoku

Lista globalnych ograniczeń dostępnych w MiniZinc: http://www.minizinc.org/downloads/doc-latest/mzn-globals.html

Zadanie Dodatkowe: Magiczne ciągi