1
0
This repository has been archived on 2025-03-06. You can view files and clone it, but cannot push or open issues or pull requests.
on-restart-benchmarks/tests/spec/examples/wolf_goat_cabbage.mzn
Jip J. Dekker fad1b07018 Squashed 'software/minizinc/' content from commit 4f10c8205
git-subtree-dir: software/minizinc
git-subtree-split: 4f10c82056ffcb1041d7ffef29d77a7eef92cf76
2021-06-16 14:06:46 +10:00

988 lines
27 KiB
MiniZinc

/***
--- !Test
solvers: [cbc]
check_against: [gecode]
expected: !Result
status: SATISFIED
--- !Test
solvers: [gecode, chuffed]
expected:
- !Result
solution: !Solution
cabbage:
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
farmer:
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
goat:
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
wolf:
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- !Result
solution: !Solution
cabbage:
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
farmer:
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [false, true, false]
- [true, false, false]
- [true, false, false]
goat:
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [false, true, false]
- [true, false, false]
- [true, false, false]
wolf:
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- !Result
solution: !Solution
cabbage:
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
farmer:
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
goat:
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
wolf:
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- !Result
solution: !Solution
cabbage:
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
farmer:
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
goat:
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
wolf:
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- !Result
solution: !Solution
cabbage:
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
farmer:
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [false, true, false]
- [true, false, false]
goat:
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [false, true, false]
- [true, false, false]
wolf:
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- !Result
solution: !Solution
cabbage:
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
farmer:
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [true, false, false]
goat:
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [true, false, false]
wolf:
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- !Result
solution: !Solution
cabbage:
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
farmer:
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
goat:
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
wolf:
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- !Result
solution: !Solution
cabbage:
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
farmer:
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
goat:
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
wolf:
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- !Result
solution: !Solution
cabbage:
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
farmer:
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
goat:
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
wolf:
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- !Result
solution: !Solution
cabbage:
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
farmer:
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [true, false, false]
- [true, false, false]
goat:
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [false, true, false]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [false, true, false]
- [true, false, false]
- [true, false, false]
wolf:
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, false, true]
- [false, true, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
- [true, false, false]
***/
%-----------------------------------------------------------------------------%
% The wolf, goat, cabbage problem
%
% A farmer has to take a wolf, goat and cabbage across a bridge
% He can only take one thing at a time
% The wolf and goat can't be left together alone (without the farmer)
% The goat and cabbage can't be left alone together
%-----------------------------------------------------------------------------%
% horizon is the maximum number of steps that might be required in the plan
int: horizon = 20;
%-----------------------------------------------------------------------------%
% 1..3 represent the three locations:
% 1 is on the left bank of the river
% 2 is on the bridge
% 3 is on the right bank
% A boolean, for each object, time and location,
% holds if the object is at the location at that time
array [1..horizon,1..3] of var bool: wolf;
array [1..horizon,1..3] of var bool: goat;
array [1..horizon,1..3] of var bool: cabbage;
array [1..horizon,1..3] of var bool: farmer;
%-----------------------------------------------------------------------------%
% Things can only move from bank to bridge, or from bridge to bank, in one step
constraint forall(t in 2..horizon,loc1 in 1..3,loc2 in 1..3)
(wolf[t-1,loc1] /\ wolf[t,loc2] -> loc1-loc2<2 /\ loc2-loc1<2);
constraint forall(t in 2..horizon,loc1 in 1..3,loc2 in 1..3)
(goat[t-1,loc1] /\ goat[t,loc2] -> loc1-loc2<2 /\ loc2-loc1<2);
constraint forall(t in 2..horizon,loc1 in 1..3,loc2 in 1..3)
(cabbage[t-1,loc1] /\ cabbage[t,loc2] -> loc1-loc2<2 /\ loc2-loc1<2);
constraint forall(t in 2..horizon,loc1 in 1..3,loc2 in 1..3)
(farmer[t-1,loc1] /\ farmer[t,loc2] -> loc1-loc2<2 /\ loc2-loc1<2);
% Can't leave wolf and goat, or goat and cabbage, together
constraint (forall(t in 1..horizon,loc in 1..3)
( (wolf[t,loc] /\ goat[t,loc] -> farmer[t,loc])
/\
(goat[t,loc] /\ cabbage[t,loc] -> farmer[t,loc])
) );
% The wolf is somewhere at each time point, and is only in one place
constraint forall(t in 1..horizon)
(exists(loc in 1..3)
(wolf[t,loc] /\ forall(loc2 in 1..3 where loc2!=loc)
(not wolf[t,loc2])
)
);
% Similarly for the goat, cabbage and farmer...
constraint forall(t in 1..horizon)
(exists(loc in 1..3)
(goat[t,loc] /\ forall(loc2 in 1..3 where loc2!=loc)
(not goat[t,loc2])
)
);
constraint forall(t in 1..horizon)
(exists(loc in 1..3)
(cabbage[t,loc] /\ forall(loc2 in 1..3 where loc2!=loc)
(not cabbage[t,loc2])
)
);
constraint forall(t in 1..horizon)
(exists(loc in 1..3)
(farmer[t,loc] /\ forall(loc2 in 1..3 where loc2!=loc)
(not farmer[t,loc2])
)
);
% The wolf can ony be on the bridge if:
% (a) The farmer is on the bridge, and neither the goat nor the cabbage is
% (b) The farmer was previously on the same bank as the wolf
% (c) The farmer goes subsequently to the same bank as the wolf
constraint forall(t in 2..horizon-1)
((wolf[t,2] -> farmer[t,2] /\ not goat[t,2] /\ not cabbage[t,2]
/\ (wolf[t-1,3] <-> farmer[t-1,3]) /\ not farmer[t-1,2]
/\ (wolf[t+1,3] <-> farmer[t+1,3]) /\ not farmer[t+1,2])
/\
% Similarly for the cabbage
(cabbage[t,2] -> farmer[t,2] /\ not goat[t,2] /\ not wolf[t,2]
/\ (cabbage[t-1,3] <-> farmer[t-1,3]) /\ not farmer[t-1,2]
/\ (cabbage[t+1,3] <-> farmer[t+1,3]) /\ not farmer[t+1,2])
/\
% and for the goat
(goat[t,2] -> farmer[t,2] /\ not wolf[t,2] /\ not cabbage[t,2]
/\ (goat[t-1,3] <-> farmer[t-1,3]) /\ not farmer[t-1,2]
/\ (goat[t+1,3] <-> farmer[t+1,3]) /\ not farmer[t+1,2])
);
% The animals all start on the right bank and finish on the left bank
constraint
(wolf[1,3] /\ goat[1,3] /\ cabbage[1,3]
/\
wolf[horizon,1] /\ goat[horizon,1] /\ cabbage[horizon,1]
);
solve ::bool_search(array1d(1..3*horizon,wolf)++array1d(1..3*horizon,goat)++array1d(1..3*horizon,cabbage)++array1d(1..3*horizon,farmer), input_order, indomain_max, complete) satisfy;
%-----------------------------------------------------------------------------%
output [
"wolf : ", show(wolf), "\n",
"goat : ", show(goat), "\n",
"cabbage : ", show(cabbage), "\n",
"farmer : ", show(farmer), "\n"
];
%-----------------------------------------------------------------------------%
%-----------------------------------------------------------------------------%