include "alldifferent.mzn";
array[Person] of var 0..4: obj =
[left(position[i]) +
right(position[i]) +
front(position[i]) +
rear(position[i])
| i in Person];
output [show(obj),
show(position)];
solve maximize sum(obj);
int: n;
array[Person, Person] of bool: friend;
set of int: Person = 1..n;
array[Person] of var Person: position;
constraint alldifferent(position);
int: m = n div 2;
constraint assert(n mod 2 = 0, "n must be even");
function var 0..1: left(var Person: i) =
if i > 1 /\ i != m + 1
then bool2int(friend[position[i], position[i-1]])
else 0 endif;
function var 0..1: right(var Person: i) =
if i < n /\ i != m
then bool2int(friend[position[i], position[i+1]])
else 0 endif;
function var 0..1: front(var Person: i) =
if i > m
then bool2int(friend[position[i], position[i-m]])
else 0 endif;
function var 0..1: rear(var Person: i) =
if i < m
then bool2int(friend[position[i], position[i+m]])
else 0 endif;
Command
$ minizinc groupphoto.mzn data/groupphoto1.dzn.Code: