1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | language ESSENCE 1.2.0 $ prob008.essence: Vessel Loading $ Problem details available at http://www.csplib.org/Problems/prob008/ $ 25 July 2007 $ $ deck_width : the width of the ship deck $ deck_length : the length of the ship deck $ n_containers : the number of containers $ n_classes : the number of container classes given deck_width, deck_length, n_containers, n_classes : int (1..) $ Container : containers are represented as an integer between 1 and n_containers $ Class : classes are represented as an integer between 1 and n_classes $ Width : a container width may be between 1 and the width of the deck $ Length : a container length may be between 1 and the length of the deck $ X: a position on x-axis (width) of the deck $ Y: a position on y-axis (length) of the deck letting Container be domain int (1..n_containers), Class be domain int (1..n_classes), Width be domain int (1..deck_width), Length be domain int (1..deck_length), X be domain int (0..deck_width), Y be domain int (0..deck_length) $ width : a container's width $ length : a container's length $ class : a container's class $ separation: the minimum allowed separation between two container classes given width : function ( total ) Container --> Width, length : function ( total ) Container --> Length, class : function ( total ) Container --> Class, separation : function ( total ) set ( size 2) of Class --> int (0..) $ west : the x coordinate of a container's western edge $ north : the y coordinate of a container's northern edge $ east : the x coordinate of a container's eastern edge $ south : the y coordinate of a container's southern edge find west, east : function ( total ) Container --> X, north, south : function ( total ) Container --> Y such that $ all north, east, south & west coordinates are valid according to the given $ width and length parameters forAll c : Container . (east(c) - west(c) = width(c) /\ south(c) - north(c) = length(c)) \/ (east(c) - west(c) = length(c) /\ south(c) - north(c) = width(c)) such that $ no two containers occupy the same space forAll c1, c2 : Container . c1 != c2 -> west(c1) != west(c2) \/ north(c1) != north(c2) such that $ containers do not overlap each other forAll c1, c2 : Container . c1 != c2 -> max ({west(c1), west(c2)}) - min ({east(c1), east(c2)}) >= 0 \/ max ({north(c1), north(c2)}) - min ({south(c1), south(c2)}) >= 0 such that $ container placement meets the class separation constraints forAll c1, c2 : Container . c1 != c2 -> max ({west(c1), west(c2)}) - min ({east(c1), east(c2)}) >= separation({class(c1), class(c2)}) \/ max ({north(c1), north(c2)}) - min ({south(c1), south(c2)}) >= separation({class(c1), class(c2)}) |