/* A Tokyo Elevator Puzzle in Picat. Problem from Martin J.Chlond "A Tokyo Elevator Puzzle" http://ite.pubs.informs.org/Vol6No3/Chlond/ Note from the original OPL model: """ Model name : elevator.mod Description : solves Elevator puzzles Source : The Tokyo Puzzles - Kobon Fujimura Date written : 7/8/06 Written by : Martin Chlond, Lancashire Business School Email : mchlond@uclan.ac.uk """ This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ % import cp. % 8.2s for go/0. % import sat. % 2.5s for go/0. import mip. % 0.5s for go/0. main => go. go ?=> do_elevator(6_3), nl, do_elevator(8_4), nl. go => true. % % Run an Elevator problem. % do_elevator(Problem) => println(problem=Problem), problem(Problem,M,N,C), elevator(M,N,C, X,SumX), println(sumX=SumX), println(x=X), foreach(I in 1..M) if X[I] == 1 then println(C[I]) end end, nl. % % Elevator model % elevator(M,N,C,X,SumX) => X = new_list(M), X :: 0..1, SumX #= sum(X), % each pair of floors connected by at least one elevator foreach(J in 1..N, K in 1..N) sum([C[I,J]*C[I,K]*X[I] : I in 1..M]) #>= 1 end, solve($[min(SumX)],X). % % Data from http://ite.pubs.informs.org/Vol6No3/Chlond/data1.php % % % Data set for elevator puzzle % 6 floors, 3 visits (excluding top and bottom) % problem(6_3,M,N,C) => M = 20, N = 6, C = [ [1, 1, 1, 0, 0, 0], [1, 1, 0, 1, 0, 0], [1, 1, 0, 0, 1, 0], [1, 1, 0, 0, 0, 1], [1, 0, 1, 1, 0, 0], [1, 0, 1, 0, 1, 0], [1, 0, 1, 0, 0, 1], [1, 0, 0, 1, 1, 0], [1, 0, 0, 1, 0, 1], [1, 0, 0, 0, 1, 1], [0, 1, 1, 1, 0, 0], [0, 1, 1, 0, 1, 0], [0, 1, 1, 0, 0, 1], [0, 1, 0, 1, 1, 0], [0, 1, 0, 1, 0, 1], [0, 1, 0, 0, 1, 1], [0, 0, 1, 1, 1, 0], [0, 0, 1, 1, 0, 1], [0, 0, 1, 0, 1, 1], [0, 0, 0, 1, 1, 1] ]. % % Data set for elevator puzzle % 8 floors, 4 visits (excluding top and bottom) % problem(8_4,M,N,C) => M = 70, N = 8, C = [ [0, 0, 0, 0, 1, 1, 1, 1], [0, 0, 0, 1, 0, 1, 1, 1], [0, 0, 1, 0, 0, 1, 1, 1], [0, 1, 0, 0, 0, 1, 1, 1], [1, 0, 0, 0, 0, 1, 1, 1], [0, 0, 0, 1, 1, 0, 1, 1], [0, 0, 1, 0, 1, 0, 1, 1], [0, 1, 0, 0, 1, 0, 1, 1], [1, 0, 0, 0, 1, 0, 1, 1], [0, 0, 1, 1, 0, 0, 1, 1], [0, 1, 0, 1, 0, 0, 1, 1], [1, 0, 0, 1, 0, 0, 1, 1], [0, 1, 1, 0, 0, 0, 1, 1], [1, 0, 1, 0, 0, 0, 1, 1], [1, 1, 0, 0, 0, 0, 1, 1], [0, 0, 0, 1, 1, 1, 0, 1], [0, 0, 1, 0, 1, 1, 0, 1], [0, 1, 0, 0, 1, 1, 0, 1], [1, 0, 0, 0, 1, 1, 0, 1], [0, 0, 1, 1, 0, 1, 0, 1], [0, 1, 0, 1, 0, 1, 0, 1], [1, 0, 0, 1, 0, 1, 0, 1], [0, 1, 1, 0, 0, 1, 0, 1], [1, 0, 1, 0, 0, 1, 0, 1], [1, 1, 0, 0, 0, 1, 0, 1], [0, 0, 1, 1, 1, 0, 0, 1], [0, 1, 0, 1, 1, 0, 0, 1], [1, 0, 0, 1, 1, 0, 0, 1], [0, 1, 1, 0, 1, 0, 0, 1], [1, 0, 1, 0, 1, 0, 0, 1], [1, 1, 0, 0, 1, 0, 0, 1], [0, 1, 1, 1, 0, 0, 0, 1], [1, 0, 1, 1, 0, 0, 0, 1], [1, 1, 0, 1, 0, 0, 0, 1], [1, 1, 1, 0, 0, 0, 0, 1], [0, 0, 0, 1, 1, 1, 1, 0], [0, 0, 1, 0, 1, 1, 1, 0], [0, 1, 0, 0, 1, 1, 1, 0], [1, 0, 0, 0, 1, 1, 1, 0], [0, 0, 1, 1, 0, 1, 1, 0], [0, 1, 0, 1, 0, 1, 1, 0], [1, 0, 0, 1, 0, 1, 1, 0], [0, 1, 1, 0, 0, 1, 1, 0], [1, 0, 1, 0, 0, 1, 1, 0], [1, 1, 0, 0, 0, 1, 1, 0], [0, 0, 1, 1, 1, 0, 1, 0], [0, 1, 0, 1, 1, 0, 1, 0], [1, 0, 0, 1, 1, 0, 1, 0], [0, 1, 1, 0, 1, 0, 1, 0], [1, 0, 1, 0, 1, 0, 1, 0], [1, 1, 0, 0, 1, 0, 1, 0], [0, 1, 1, 1, 0, 0, 1, 0], [1, 0, 1, 1, 0, 0, 1, 0], [1, 1, 0, 1, 0, 0, 1, 0], [1, 1, 1, 0, 0, 0, 1, 0], [0, 0, 1, 1, 1, 1, 0, 0], [0, 1, 0, 1, 1, 1, 0, 0], [1, 0, 0, 1, 1, 1, 0, 0], [0, 1, 1, 0, 1, 1, 0, 0], [1, 0, 1, 0, 1, 1, 0, 0], [1, 1, 0, 0, 1, 1, 0, 0], [0, 1, 1, 1, 0, 1, 0, 0], [1, 0, 1, 1, 0, 1, 0, 0], [1, 1, 0, 1, 0, 1, 0, 0], [1, 1, 1, 0, 0, 1, 0, 0], [0, 1, 1, 1, 1, 0, 0, 0], [1, 0, 1, 1, 1, 0, 0, 0], [1, 1, 0, 1, 1, 0, 0, 0], [1, 1, 1, 0, 1, 0, 0, 0], [1, 1, 1, 1, 0, 0, 0, 0] ].