====== Lab CSP: Zastosowanie w praktyce ===== 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). ===== Rozgrzewka: problem pakowania ====== 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. {{ :pl:dydaktyka:csp:square_packing.png?300|}} * **Definicja problemu**: mając ''n'' kwadratów o rozmiarach kolejno ''1x1,2x2,...,nxn'', należy znaleźć prostokąt a najmniejszym polu, wewnątrz którego zmieszczą się te kwadraty bez nachodzenia na siebie. * **Etap 1:** - Proszę uzupełnić poniższy model a brakujące granice dziedzin. - Podpowiedź - należy użyć set comprehension (np. ''[i | in SQUARES]'') * **Etap 2:** - Należy uzupełnić ograniczenia pod odpowiednimi komentarzami tak, aby problem był rozwiązywalny dla małych ''n'' - Podpowiedź - wygodne może być złożenie ograniczeń korzystając z alternatywy ''\/'' * **Etap 3:** - zastosować globalne ograniczenie [[http://www.minizinc.org/2.0/doc-lib/doc-globals-packing.html|diffn]] - Podpowiedź - może być konieczne dodanie kolejnego parametru w postaci tablicy * **Etap 4:** - Dodać nadmiarowe ograniczenia - Podpowiedź - jaka jest relacja między pakowanie a harmonogramowaniem pracy, np. używając ograniczenia {{:pl:dydaktyka:csp:cumulative.png?linkonly|cumulative}} * **Etap 5:** - Zmienić procedurę szukania tak, aby najpierw próbowała ustalić rozmiar prostokąta, zaczynając od najmniejszych wartości - Zmienić procedurę szukania tak, aby najpierw próbowała ustalić położenie największych kwadratów. - Połączyć obie strategie używając ''seq_search'' ([[http://www.minizinc.org/downloads/doc-latest/minizinc-tute.pdf|Tutorial MiniZinca, s. 57]]) - Porównać obie strategie szukania z domyślną - która strategia wydaje się bardziej opłacalna w trudnych przypadkach? - Podpowiedź 1 - kolejność przeszukiwania zmiennych można wymusić przez adnotację ''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''. - Podpowiedź 2 - dla uproszczenia tablicę można odwrócić używające funkcji ''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 ..: height; % wysokość prostokątnego pojemnika var ..: width; % szerokość prostokątnego pojemnika var ..: area = height * width; % pole pojemnika array[SQUARES] of var ..: x; % współrzędne kwadratów w pojemniku array[SQUARES] of var ..: 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)] ===== Prawdziwy problem: ładowanie węgla ===== ==== Krótki opis ==== 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. ==== Plan Zajęć ==== 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 [[http://www.minizinc.org/2.0/doc-lib/doc-builtins-array.html|sort_by]]. ==== Materiały ==== - Proszę pobrać i rozpakować {{:pl:dydaktyka:csp:portschedule.zip|dane problemu}}. - Plik ''handout.pdf'' zawiera szczegółowy opis projektu - Plik ''portschedule.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.