/* Model name : marathon.mod Description : marathon puzzle Source : www.brainbashers.com - daily puzzle 22/5/13 Written by : Martin Chlond, Lancashire Business School Email : mchlond@uclan.ac.uk Date written : 22/5/13 Matthew Merryman beat Tom Trent and Jimmy James. Peter Piper beat Jimmy James, Tom Trent and Alan Ardman. Zach Zebra lost to Peter Piper. Graham Goodfellow beat Tom Trent. Zach Zebra beat Frank Flintbone. Graham Goodfellow lost to Frank Flintbone and Peter Piper. Tom Trent beat Brian Brick. Alan Ardman beat Zach Zebra, Kevin Kingfisher and Graham Goodfellow. Kevin Kingfisher lost to Graham Goodfellow and Matthew Merryman. Brian Brick beat Kevin Kingfisher. Matthew Merryman lost to Alan Ardman and Zach Zebra. Frank Flintbone beat Tom Trent, Matthew Merryman and Brian Brick. Tom Trent lost to Jimmy James and Alan Ardman. Jimmy James beat Graham Goodfellow and Brian Brick. */ # set of runners set N := 1..10; # A[j] is a subset of runners that runner j finished after set A{j in N}, within N, default {}; # B[j] is a subset of runners that runner j finished before set B{j in N}, within N, default {}; # names of runners param nRunner{j in N}, symbolic; var x{i in N,j in N} binary; # x[i,j] if runner i in position j ,else 0 subject to # each position one runner epor{j in N}: sum{i in N} x[i,j] = 1; # each runner one position erop{i in N}: sum{j in N} x[i,j] = 1; # ensure 'befores' and 'afters' are consistent with puzzle conditions eacp{i in N, k in A[i]}: sum{j in N} j*x[i,j] >= sum{j in N} j*x[k,j] + 1; ebcp{i in N, k in B[i]}: sum{j in N} j*x[i,j] <= sum{j in N} j*x[k,j] - 1; solve; printf "\n\n"; for {j in N} { printf j; printf " "; printf nRunner[sum{i in N} i*x[i,j]]; printf "\n"; } printf "\n\n"; data; param nRunner := 1 "Alan Ardman" 2 "Brian Brick" 3 "Frank Flintbone" 4 "Graham Goodfellow" 5 "Jimmy James" 6 "Kevin Kingfisher" 7 "Matthew Merryman" 8 "Peter Piper" 9 "Tom Trent" 10 "Zach Zebra"; set A[4] := 3,8; set A[6] := 4,7; set A[7] := 1,10; set A[9] := 1,5; set A[10] := 8; set B[1] := 4,6,10; set B[2] := 6; set B[3] := 2,7,9; set B[4] := 9; set B[5] := 2,4; set B[7] := 5,9; set B[8] := 1,5,9; set B[9] := 2; set B[10] := 3; end;