Na tym laboratorium spróbujemy zamodelować w MiniZincu w miarę rzeczywisty problem. Rzeczywiste problemy mają to do siebie, że są trudne - dlatego są doskonałym testem umiejętności. Planowany czas wymagany na zrealizowanie tego laboratorium to dwa zajęcia (2x1h30min) plus czas poświęcony w domu między nimi (w razie potrzeby).
Na rozgrzewkę rozwiążmy prosty problem, który w znaczny sposób ułatwi nam modelowanie problemu końcowego. Zajmijmy się tak zwanym problemem pakowania. Istnieje wiele rodzajów problemów pakowania - to, co je łączy, to konieczność upakowania n-wymiarowych brył w n-wymiarowym pojemniku. My zajmiemy się bardzo prostym przypadkiem pakowania kwadratów w pojemniku o kształcie prostokąta.
n
kwadratów o rozmiarach kolejno 1×1,2×2,…,nxn
, należy znaleźć prostokąt a najmniejszym polu, wewnątrz którego zmieszczą się te kwadraty bez nachodzenia na siebie. [i | in SQUARES]
)n
\/
seq_search
(Tutorial MiniZinca, s. 57)input_order
- w tym celu należy wcześniej zmienne włożyć w odpowiedniej kolejności do jednej tablicy zmiennych używając np. array comprehension
.reverse
— ale nie jest to konieczne.% Parametry %%%%%%%%%%% int: n; % liczba kwadratów set of int: SQUARES = 1..n; % zbiór dostępnych kwadratów % Zmienne %%%%%%%%%%% var <min>..<max>: height; % wysokość prostokątnego pojemnika var <min>..<max>: width; % szerokość prostokątnego pojemnika var <min>..<max>: area = height * width; % pole pojemnika array[SQUARES] of var <min>..<max>: x; % współrzędne kwadratów w pojemniku array[SQUARES] of var <min>..<max>: y; % współrzędne kwadratów w pojemniku % Ograniczenia %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Ograniczenie 1: kwadraty nie powinny wychodzić poza prostokąt % Ograniczenie 2: kwadraty nie powinny nachodzić na siebie % Cel %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% solve minimize area; % Nudne wyjście % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% output [ show(i) ++ " > (" ++ show(x[i]) ++ "," ++ show(y[i]) ++ ")\n" | i in 1..n] ++ ["area = " ++ show(width) ++ " * " ++ show(height) ++ " = " ++ show(area)]
Głównym problemem, z którym przyjdzie nam się zmierzyć, będzie problem harmonogramowania pracy portu, który ma załadować węgiel na odpowiednie kontenerowce. Zastosowane poniżej materiały pochodzą z Uniwersytetu w Melbourne, ponieważ problem ten jest realnym wyzwaniem dla prężnie funkcjonującego w Australii eksportu węgla.
W ramach pierwszego laboratorium należy zapoznać się z problemem i rozwiązać poziom „A”. Jest on analogiczny do problemu pakowania, przedstawionego powyżej. W ramach drugiego laboratorium zajmiemy się pozostałymi fazami.
Sortowanie tablicy na potrzeby definiowania kolejności przeszukiwania zmiennych można zrealizować używając funkcji sort_by.
handout.pdf
zawiera szczegółowy opis projektuportschedule.mzp
jest plikiem projektu MiniZinc. Należy go otworzyć w MiniZincIDE. Plik źródłowy jest wzbogacony o liczne komentarze, które powinny ułatwić budowę modelu.