1
0

Remove tests giving invalid results

This commit is contained in:
Jip J. Dekker 2021-05-12 11:16:48 +10:00
parent d1f017fc6f
commit 0b19327be7
29 changed files with 0 additions and 848 deletions

View File

@ -9,11 +9,6 @@
"stack-cuttingstock","stack-cuttingstock/stack-cutstock-cumu.mzn","stack-cuttingstock/d8.dzn"
"stack-cuttingstock","stack-cuttingstock/stack-cutstock-cumu.mzn","stack-cuttingstock/d5.dzn"
"stack-cuttingstock","stack-cuttingstock/stack-cutstock-cumu.mzn","stack-cuttingstock/d7.dzn"
"zephyrus","zephyrus/zephyrus.mzn","zephyrus/12__8__6__3.dzn"
"zephyrus","zephyrus/zephyrus.mzn","zephyrus/14__8__6__3.dzn"
"zephyrus","zephyrus/zephyrus.mzn","zephyrus/14__6__8__3.dzn"
"zephyrus","zephyrus/zephyrus.mzn","zephyrus/12__6__8__3.dzn"
"zephyrus","zephyrus/zephyrus.mzn","zephyrus/14__10__8__3.dzn"
"depot-placement","depot-placement/depot_placement.mzn","depot-placement/ts225_5.dzn"
"depot-placement","depot-placement/depot_placement.mzn","depot-placement/u159_4.dzn"
"depot-placement","depot-placement/depot_placement.mzn","depot-placement/att48_5.dzn"
@ -38,21 +33,6 @@
"depot-placement","depot-placement/depot_placement.mzn","depot-placement/ulysses16_5.dzn"
"depot-placement","depot-placement/depot_placement.mzn","depot-placement/ts225_6.dzn"
"depot-placement","depot-placement/depot_placement.mzn","depot-placement/ulysses22_6.dzn"
"train","train/train.mzn","train/instance.15.dzn"
"train","train/train.mzn","train/instance.2.dzn"
"train","train/train.mzn","train/instance.3.dzn"
"train","train/train.mzn","train/instance.6.dzn"
"train","train/train.mzn","train/instance.12.dzn"
"train","train/train.mzn","train/instance.5.dzn"
"train","train/train.mzn","train/instance.1.dzn"
"train","train/train.mzn","train/instance.13.dzn"
"train","train/train.mzn","train/instance.4.dzn"
"train","train/train.mzn","train/instance.9.dzn"
"train","train/train.mzn","train/instance.14.dzn"
"train","train/train.mzn","train/instance.8.dzn"
"train","train/train.mzn","train/instance.7.dzn"
"train","train/train.mzn","train/instance.11.dzn"
"train","train/train.mzn","train/instance.10.dzn"
"triangular","triangular/triangular.mzn","triangular/n10.dzn"
"triangular","triangular/triangular.mzn","triangular/n23.dzn"
"triangular","triangular/triangular.mzn","triangular/n37.dzn"
@ -152,11 +132,6 @@
"kidney-exchange","kidney-exchange/ccmcp.mzn","kidney-exchange/3_20_0.30_5.dzn"
"kidney-exchange","kidney-exchange/ccmcp.mzn","kidney-exchange/3_20_0.25_2.dzn"
"kidney-exchange","kidney-exchange/ccmcp.mzn","kidney-exchange/3_25_0.20_3.dzn"
"median-string","median-string/median_string_dp.mzn","median-string/p2_2_20-2.dzn"
"median-string","median-string/median_string_dp.mzn","median-string/p1_15_20-1.dzn"
"median-string","median-string/median_string_dp.mzn","median-string/p2_10_8-3.dzn"
"median-string","median-string/median_string_dp.mzn","median-string/p2_10_8-0.dzn"
"median-string","median-string/median_string_dp.mzn","median-string/p2_4_20-0.dzn"
"road-cons","road-cons/road_naive.mzn","road-cons/road_33.dzn"
"road-cons","road-cons/road_naive.mzn","road-cons/road_26.dzn"
"road-cons","road-cons/road_naive.mzn","road-cons/road_25.dzn"

1 problem model data_file
9 stack-cuttingstock stack-cuttingstock/stack-cutstock-cumu.mzn stack-cuttingstock/d8.dzn
10 stack-cuttingstock stack-cuttingstock/stack-cutstock-cumu.mzn stack-cuttingstock/d5.dzn
11 stack-cuttingstock stack-cuttingstock/stack-cutstock-cumu.mzn stack-cuttingstock/d7.dzn
zephyrus zephyrus/zephyrus.mzn zephyrus/12__8__6__3.dzn
zephyrus zephyrus/zephyrus.mzn zephyrus/14__8__6__3.dzn
zephyrus zephyrus/zephyrus.mzn zephyrus/14__6__8__3.dzn
zephyrus zephyrus/zephyrus.mzn zephyrus/12__6__8__3.dzn
zephyrus zephyrus/zephyrus.mzn zephyrus/14__10__8__3.dzn
12 depot-placement depot-placement/depot_placement.mzn depot-placement/ts225_5.dzn
13 depot-placement depot-placement/depot_placement.mzn depot-placement/u159_4.dzn
14 depot-placement depot-placement/depot_placement.mzn depot-placement/att48_5.dzn
33 depot-placement depot-placement/depot_placement.mzn depot-placement/ulysses16_5.dzn
34 depot-placement depot-placement/depot_placement.mzn depot-placement/ts225_6.dzn
35 depot-placement depot-placement/depot_placement.mzn depot-placement/ulysses22_6.dzn
train train/train.mzn train/instance.15.dzn
train train/train.mzn train/instance.2.dzn
train train/train.mzn train/instance.3.dzn
train train/train.mzn train/instance.6.dzn
train train/train.mzn train/instance.12.dzn
train train/train.mzn train/instance.5.dzn
train train/train.mzn train/instance.1.dzn
train train/train.mzn train/instance.13.dzn
train train/train.mzn train/instance.4.dzn
train train/train.mzn train/instance.9.dzn
train train/train.mzn train/instance.14.dzn
train train/train.mzn train/instance.8.dzn
train train/train.mzn train/instance.7.dzn
train train/train.mzn train/instance.11.dzn
train train/train.mzn train/instance.10.dzn
36 triangular triangular/triangular.mzn triangular/n10.dzn
37 triangular triangular/triangular.mzn triangular/n23.dzn
38 triangular triangular/triangular.mzn triangular/n37.dzn
132 kidney-exchange kidney-exchange/ccmcp.mzn kidney-exchange/3_20_0.30_5.dzn
133 kidney-exchange kidney-exchange/ccmcp.mzn kidney-exchange/3_20_0.25_2.dzn
134 kidney-exchange kidney-exchange/ccmcp.mzn kidney-exchange/3_25_0.20_3.dzn
median-string median-string/median_string_dp.mzn median-string/p2_2_20-2.dzn
median-string median-string/median_string_dp.mzn median-string/p1_15_20-1.dzn
median-string median-string/median_string_dp.mzn median-string/p2_10_8-3.dzn
median-string median-string/median_string_dp.mzn median-string/p2_10_8-0.dzn
median-string median-string/median_string_dp.mzn median-string/p2_4_20-0.dzn
135 road-cons road-cons/road_naive.mzn road-cons/road_33.dzn
136 road-cons road-cons/road_naive.mzn road-cons/road_26.dzn
137 road-cons road-cons/road_naive.mzn road-cons/road_25.dzn

View File

@ -1,81 +0,0 @@
%------------------------------------------------------------------------------
% Parameters
int: num_strings;
int: max_length_strings;
int: max_char;
int: max_length_median;
array [1..num_strings, 1..max_length_strings] of int: strings;
array [1..num_strings] of int: str_length;
%------------------------------------------------------------------------------
% Variables
array [1..max_length_strings] of var 0..max_char: median;
array [1..num_strings] of var 0..2*max_length_strings: distances;
int: obj_ub = num_strings * 2 * max_length_strings;
var 0..obj_ub: objective;
%------------------------------------------------------------------------------
% Predicates
predicate lcs_global(array[int] of var int: S1, array[int] of var int: S2, var int: ED) =
let { int: l1 = min(index_set(S1)) - 1;
int: l2 = min(index_set(S2)) - 1;
int: u1 = max(index_set(S1));
int: u2 = max(index_set(S2));
array[l1..u1,l2..u2] of var 0..u1+u2: T; } in
T[l1,l2] = 0 /\
T[u1,u2] = ED /\
forall(i in l1+1..u1, j in l2+1..u2)
(T[i,j] >= 0 /\ T[i,j] <= i+j) /\
forall(j in l2+1..u2)(T[l1,j] = j-l2) /\
forall(i in l1+1..u1)(T[i,l2] = i-l1) /\
forall(i in l1+1..u1, j in l2+1..u2)
(T[i,j] = if S1[i] = S2[j] then
T[i-1,j-1]
else
if S1[i] = 0 then
T[i-1,j]
else
if S2[j] = 0 then
T[i,j-1]
else
min([T[i-1,j]+1,T[i,j-1]+1])
endif
endif
endif
);
%------------------------------------------------------------------------------
% Constraints
constraint forall(i in 1..num_strings)(
lcs_global([strings[i,j] | j in 1..max_length_strings], median, distances[i])
);
constraint forall(i in max_length_median+1..max_length_strings)(
median[i] = 0
);
constraint objective = sum(i in 1..num_strings)(distances[i]);
%------------------------------------------------------------------------------
% Solve item
solve
:: int_search(median, input_order, indomain_min, complete)
minimize objective;
%------------------------------------------------------------------------------
% Output
output [
"median = \(median);\n",
"objective = \(objective);\n"
];

View File

@ -1,6 +0,0 @@
num_strings=15;
max_length_strings=20;
max_length_median=20;
max_char=4;
strings=[|2,1,2,1,1,1,2,1,2,2,1,1,1,2,1,1,2,2,1,1|2,1,1,1,1,2,1,1,1,2,1,1,2,1,1,2,1,1,2,1|1,1,1,3,1,1,1,1,1,2,1,2,2,2,2,1,1,1,1,1|2,1,2,1,2,1,1,1,2,2,1,2,3,1,1,2,1,1,1,1|1,1,1,1,1,1,1,2,1,1,2,2,1,2,1,1,1,3,2,1|1,1,2,1,1,1,1,1,1,2,1,2,1,2,1,1,1,1,1,1|1,1,1,2,2,1,1,2,1,2,1,1,1,2,1,2,1,1,1,2|2,1,2,1,1,1,2,1,1,1,2,1,1,1,2,1,2,1,1,1|2,1,1,1,1,2,1,1,2,1,1,1,1,1,1,2,2,2,1,1|2,1,2,2,2,1,1,1,1,1,1,1,1,1,1,2,3,1,2,1|1,3,1,2,1,1,3,1,1,1,1,2,1,2,1,1,1,2,1,2|1,1,2,1,3,1,1,1,1,1,1,1,1,1,2,1,2,1,1,1|1,1,1,1,1,1,2,1,1,2,1,1,2,1,1,1,2,2,1,3|1,2,1,2,1,1,2,2,3,1,2,1,1,2,1,1,1,1,2,2|2,1,1,2,2,2,1,2,2,1,1,1,2,2,1,1,1,1,2,1|];
str_length=[20,20,20,20,20,20,20,20,20,20,20,20,20,20,20];

View File

@ -1,6 +0,0 @@
num_strings=10;
max_length_strings=8;
max_length_median=8;
max_char=4;
strings=[|4,3,4,2,0,0,0,0|2,1,2,4,1,4,0,0|4,0,0,0,0,0,0,0|1,4,3,2,2,3,2,0|3,3,2,3,1,2,0,0|3,0,0,0,0,0,0,0|1,4,3,2,0,0,0,0|1,3,3,3,4,2,3,0|2,1,2,0,0,0,0,0|1,2,3,4,3,0,0,0|];
str_length=[4,6,1,7,6,1,4,7,3,5];

View File

@ -1,6 +0,0 @@
num_strings=10;
max_length_strings=8;
max_length_median=8;
max_char=4;
strings=[|3,1,2,3,4,1,1,0|1,4,1,4,1,2,0,0|1,3,1,0,0,0,0,0|3,0,0,0,0,0,0,0|4,3,0,0,0,0,0,0|1,4,4,2,3,0,0,0|4,3,2,2,1,3,1,1|2,0,0,0,0,0,0,0|3,3,2,3,4,3,0,0|2,3,4,1,1,2,2,0|];
str_length=[7,6,3,1,2,5,8,1,6,7];

View File

@ -1,6 +0,0 @@
num_strings=2;
max_length_strings=20;
max_length_median=20;
max_char=4;
strings=[|4,4,4,1,4,3,1,3,4,1,0,0,0,0,0,0,0,0,0,0|2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0|];
str_length=[10,2];

View File

@ -1,6 +0,0 @@
num_strings=4;
max_length_strings=20;
max_length_median=20;
max_char=4;
strings=[|4,4,3,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0|2,3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0|4,4,4,4,4,3,4,4,2,0,0,0,0,0,0,0,0,0,0,0|2,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0|];
str_length=[5,3,9,3];

View File

@ -1,12 +0,0 @@
n = 3;
m = 3;
maxTime = 1140;
delayTime = 5;
delayTrain = 2;
delayDuration = 5;
distance = [5,5];
passengerStart = [0,0,0];
passengerFlow = [0,10,0];
scheduledArrival = [|0,5,13, |0,15,23, |0,25,33|];
scheduledDeparture = [|0,8,16, |10,18,26, |20,28,36|];
capacity = 500;

View File

@ -1,12 +0,0 @@
n = 5;
m = 5;
maxTime = 1140;
delayTime = 15;
delayTrain = 2;
delayDuration = 20;
distance = [5,5,5,5];
passengerStart = [0,0,6,14,0];
passengerFlow = [0,10,10,10,0];
scheduledArrival = [|0,5,13,21,29, |0,15,23,31,39, |0,25,33,41,49, |0,35,43,51,59, |0,45,53,61,69|];
scheduledDeparture = [|0,8,16,24,32, |10,18,26,34,42, |20,28,36,44,52, |30,38,46,54,62, |40,48,56,64,72|];
capacity = 500;

View File

@ -1,12 +0,0 @@
n = 5;
m = 5;
maxTime = 1140;
delayTime = 38;
delayTrain = 2;
delayDuration = 5;
distance = [5,5,5,5];
passengerStart = [0,0,6,14,0];
passengerFlow = [0,10,10,10,0];
scheduledArrival = [|0,5,13,21,29, |0,15,23,31,39, |0,25,33,41,49, |0,35,43,51,59, |0,45,53,61,69|];
scheduledDeparture = [|0,8,16,24,32, |10,18,26,34,42, |20,28,36,44,52, |30,38,46,54,62, |40,48,56,64,72|];
capacity = 500;

View File

@ -1,12 +0,0 @@
n = 5;
m = 5;
maxTime = 1140;
delayTime = 25;
delayTrain = 2;
delayDuration = 5;
distance = [5,5,5,5];
passengerStart = [0,0,6,14,0];
passengerFlow = [0,10,10,10,0];
scheduledArrival = [|0,5,13,21,29, |0,15,23,31,39, |0,25,33,41,49, |0,35,43,51,59, |0,45,53,61,69|];
scheduledDeparture = [|0,8,16,24,32, |10,18,26,34,42, |20,28,36,44,52, |30,38,46,54,62, |40,48,56,64,72|];
capacity = 500;

View File

@ -1,12 +0,0 @@
n = 5;
m = 5;
maxTime = 1140;
delayTime = 25;
delayTrain = 2;
delayDuration = 10;
distance = [5,5,5,5];
passengerStart = [0,0,6,14,0];
passengerFlow = [0,10,10,10,0];
scheduledArrival = [|0,5,13,21,29, |0,15,23,31,39, |0,25,33,41,49, |0,35,43,51,59, |0,45,53,61,69|];
scheduledDeparture = [|0,8,16,24,32, |10,18,26,34,42, |20,28,36,44,52, |30,38,46,54,62, |40,48,56,64,72|];
capacity = 500;

View File

@ -1,12 +0,0 @@
n = 5;
m = 5;
maxTime = 1140;
delayTime = 25;
delayTrain = 2;
delayDuration = 15;
distance = [5,5,5,5];
passengerStart = [0,0,6,14,0];
passengerFlow = [0,10,10,10,0];
scheduledArrival = [|0,5,13,21,29, |0,15,23,31,39, |0,25,33,41,49, |0,35,43,51,59, |0,45,53,61,69|];
scheduledDeparture = [|0,8,16,24,32, |10,18,26,34,42, |20,28,36,44,52, |30,38,46,54,62, |40,48,56,64,72|];
capacity = 500;

View File

@ -1,12 +0,0 @@
n = 5;
m = 5;
maxTime = 1140;
delayTime = 25;
delayTrain = 2;
delayDuration = 20;
distance = [5,5,5,5];
passengerStart = [0,0,6,14,0];
passengerFlow = [0,10,10,10,0];
scheduledArrival = [|0,5,13,21,29, |0,15,23,31,39, |0,25,33,41,49, |0,35,43,51,59, |0,45,53,61,69|];
scheduledDeparture = [|0,8,16,24,32, |10,18,26,34,42, |20,28,36,44,52, |30,38,46,54,62, |40,48,56,64,72|];
capacity = 500;

View File

@ -1,12 +0,0 @@
n = 5;
m = 5;
maxTime = 1140;
delayTime = 5;
delayTrain = 2;
delayDuration = 5;
distance = [5,5,5,5];
passengerStart = [0,0,6,14,0];
passengerFlow = [0,10,10,10,0];
scheduledArrival = [|0,5,13,21,29, |0,15,23,31,39, |0,25,33,41,49, |0,35,43,51,59, |0,45,53,61,69|];
scheduledDeparture = [|0,8,16,24,32, |10,18,26,34,42, |20,28,36,44,52, |30,38,46,54,62, |40,48,56,64,72|];
capacity = 500;

View File

@ -1,12 +0,0 @@
n = 5;
m = 5;
maxTime = 1140;
delayTime = 5;
delayTrain = 2;
delayDuration = 10;
distance = [5,5,5,5];
passengerStart = [0,0,6,14,0];
passengerFlow = [0,10,10,10,0];
scheduledArrival = [|0,5,13,21,29, |0,15,23,31,39, |0,25,33,41,49, |0,35,43,51,59, |0,45,53,61,69|];
scheduledDeparture = [|0,8,16,24,32, |10,18,26,34,42, |20,28,36,44,52, |30,38,46,54,62, |40,48,56,64,72|];
capacity = 500;

View File

@ -1,12 +0,0 @@
n = 5;
m = 5;
maxTime = 1140;
delayTime = 5;
delayTrain = 2;
delayDuration = 15;
distance = [5,5,5,5];
passengerStart = [0,0,6,14,0];
passengerFlow = [0,10,10,10,0];
scheduledArrival = [|0,5,13,21,29, |0,15,23,31,39, |0,25,33,41,49, |0,35,43,51,59, |0,45,53,61,69|];
scheduledDeparture = [|0,8,16,24,32, |10,18,26,34,42, |20,28,36,44,52, |30,38,46,54,62, |40,48,56,64,72|];
capacity = 500;

View File

@ -1,12 +0,0 @@
n = 5;
m = 5;
maxTime = 1140;
delayTime = 5;
delayTrain = 2;
delayDuration = 20;
distance = [5,5,5,5];
passengerStart = [0,0,6,14,0];
passengerFlow = [0,10,10,10,0];
scheduledArrival = [|0,5,13,21,29, |0,15,23,31,39, |0,25,33,41,49, |0,35,43,51,59, |0,45,53,61,69|];
scheduledDeparture = [|0,8,16,24,32, |10,18,26,34,42, |20,28,36,44,52, |30,38,46,54,62, |40,48,56,64,72|];
capacity = 500;

View File

@ -1,12 +0,0 @@
n = 4;
m = 4;
maxTime = 1140;
delayTime = 15;
delayTrain = 2;
delayDuration = 5;
distance = [5,5,5];
passengerStart = [0,0,6,0];
passengerFlow = [0,10,10,0];
scheduledArrival = [|0,5,13,21, |0,15,23,31, |0,25,33,41, |0,35,43,51|];
scheduledDeparture = [|0,8,16,24, |10,18,26,34, |20,28,36,44, |30,38,46,54|];
capacity = 500;

View File

@ -1,12 +0,0 @@
n = 5;
m = 5;
maxTime = 1140;
delayTime = 15;
delayTrain = 2;
delayDuration = 5;
distance = [5,5,5,5];
passengerStart = [0,0,6,14,0];
passengerFlow = [0,10,10,10,0];
scheduledArrival = [|0,5,13,21,29, |0,15,23,31,39, |0,25,33,41,49, |0,35,43,51,59, |0,45,53,61,69|];
scheduledDeparture = [|0,8,16,24,32, |10,18,26,34,42, |20,28,36,44,52, |30,38,46,54,62, |40,48,56,64,72|];
capacity = 500;

View File

@ -1,12 +0,0 @@
n = 5;
m = 5;
maxTime = 1140;
delayTime = 15;
delayTrain = 2;
delayDuration = 10;
distance = [5,5,5,5];
passengerStart = [0,0,6,14,0];
passengerFlow = [0,10,10,10,0];
scheduledArrival = [|0,5,13,21,29, |0,15,23,31,39, |0,25,33,41,49, |0,35,43,51,59, |0,45,53,61,69|];
scheduledDeparture = [|0,8,16,24,32, |10,18,26,34,42, |20,28,36,44,52, |30,38,46,54,62, |40,48,56,64,72|];
capacity = 500;

View File

@ -1,12 +0,0 @@
n = 5;
m = 5;
maxTime = 1140;
delayTime = 15;
delayTrain = 2;
delayDuration = 15;
distance = [5,5,5,5];
passengerStart = [0,0,6,14,0];
passengerFlow = [0,10,10,10,0];
scheduledArrival = [|0,5,13,21,29, |0,15,23,31,39, |0,25,33,41,49, |0,35,43,51,59, |0,45,53,61,69|];
scheduledDeparture = [|0,8,16,24,32, |10,18,26,34,42, |20,28,36,44,52, |30,38,46,54,62, |40,48,56,64,72|];
capacity = 500;

View File

@ -1,176 +0,0 @@
%----------------------------------------------------------------------------%
%----------------------------------------------------------------------------%
%
% We have n trains moving along a single track with m stations. There is a
% non-zero constant flow of passengers arriving at all but the first and last
% station who wish to travel to the final station. Trains are originally
% scheduled so that they collect the passengers and drop them at the final
% station. To this original schedule a disruption is introduced whereby a train
% is delayed. Each of the trains (at the time of the delay) has knowledge of the
% duration of the delay. The objective is to reschedule the trains to minimize
% the average travel time of the passengers. Trains are not able to overtake
% preceding trains, however they do have the option to
% skip a station and wait longer at a station to collect more passengers.
%----------------------------------------------------------------------------%
%----------------------------------------------------------------------------%
%include "globals.mzn";
int : n;
int : m;
int : maxTime;
0..maxTime : delayTime;
1..n : delayTrain;
0..maxTime : delayDuration;
array [1..m-1] of 0..maxTime : distance;
array [1..n, 1..m] of 0..maxTime : scheduledArrival;
array [1..n, 1..m] of 0..maxTime : scheduledDeparture;
array [1..m] of 0..maxTime : passengerStart;
array [1..m] of 0..maxTime : passengerStop = [scheduledDeparture[n,j] | j in 1..m];
array [1..m] of int : passengerFlow;
array [1..n, 1..m] of var 0..maxTime : departure;
array [1..n, 1..m] of var 0..maxTime : arrival;
array [1..n] of var 0..maxTime : finalArrival = [ arrival[i,m] | i in 1..n ];
array [1..n, 1..m] of var 0..maxTime : sigmaLower;
array [1..n, 1..m] of var 0..maxTime : sigmaUpper;
int : capacity;
array [1..n, 1..m] of var 0..capacity : collect;
array [1..n, 1..m] of var 0..capacity : load;
% All trains "arrive" at the first station at time 0.
constraint forall (i in 1..n)
(arrival[i,1] = 0);
% ... and "depart" from the last station as soon as they arrive there.
constraint forall (i in 1..n)
(departure[i,m] = arrival[i,m]);
% Before the delay, everything runs to schedule.
constraint forall (i in 1..n, j in 1..m-1)
(if scheduledDeparture[i,j] <= delayTime
then departure[i,j] = scheduledDeparture[i,j]
else true
endif);
% If the train is in motion, then the arrival of the
% delayed train is at least the departure time at the previous station
% plus the ordinary travel time plus the duration of the delay.
int : destinationWhenDelayed = min([j | j in 1..m where scheduledDeparture[delayTrain,j] > delayTime]);
constraint if destinationWhenDelayed > 1
then if delayTime < scheduledDeparture[delayTrain,destinationWhenDelayed-1] + distance[destinationWhenDelayed-1]
then arrival[delayTrain,destinationWhenDelayed] >=
departure[delayTrain,destinationWhenDelayed-1] + delayDuration + distance[destinationWhenDelayed-1]
else true
endif
else true
endif;
% The train's next departure is at least the delay time plus the delay
% duration.
constraint departure[delayTrain, destinationWhenDelayed] >= delayTime + delayDuration;
% Trains depart after they arrive.
constraint forall (i in 1..n, j in 1..m)
(departure[i,j] >= arrival[i,j]);
% Trains never leave earlier than scheduled.
constraint forall (i in 1..n, j in 1..m-1)
(departure[i,j] >= scheduledDeparture[i,j]);
% There is a minimum travel time between stations.
constraint forall (i in 1..n, j in 1..m-1)
(arrival[i,j+1] >= departure[i,j] + distance[j]);
% At station 1, trains leave in order.
constraint forall (i in 1..n-1)
(departure[i,1] < departure[i+1,1]);
% At most one train dwelling at a station at a given time.
constraint forall (i in 1..n-1, j in 2..m-1)
(departure[i,j] <= arrival[i+1,j]-2);
% The sigma values partition time at each station.
constraint forall (i in 1..n, j in 1..m)
(sigmaLower[i,j] <= sigmaUpper[i,j]);
% For the first and last trains, the sigma values are equal to the
% extreme times of passenger arrivals.
constraint forall (j in 2..m-1)
((sigmaLower[1,j] = passengerStart[j])
/\ (sigmaUpper[n,j] = scheduledDeparture[n,j]));
% The sigma values join together.
constraint forall (i in 1..n-1, j in 1..m)
(sigmaUpper[i,j] = sigmaLower[i+1,j]);
% You can't pick up people after you leave.
constraint forall (i in 1..n-1, j in 1..m-1)
(sigmaUpper[i,j] <= departure[i,j]);
constraint forall (j in 1..m-1)
(sigmaUpper[n,j] <= departure[n,j]);
% Defines collect and load variables.
constraint forall (i in 1..n, j in 1..m)
(collect[i,j] = (sigmaUpper[i,j]-sigmaLower[i,j])*passengerFlow[j]);
constraint forall (i in 1..n) (load[i,1] = collect[i,1]);
constraint forall (i in 1..n, j in 2..m)
(load[i,j] = load[i,j-1] + collect[i,j]);
% If a train picks anyone up, then it must pick
% everyone up (until it gets full).
constraint forall (i in 1..n, j in 1..m-1)
(sigmaUpper[i,j] > sigmaLower[i,j] ->
((sigmaUpper[i,j] = departure[i,j]) \/
(sigmaUpper[i,j] = scheduledDeparture[n,j]) \/
(load[i,j] + bool2int(sigmaUpper[i,j] < scheduledDeparture[n,j])*passengerFlow[j] > capacity)));
% Boarding time.
constraint forall (i in 1..n, j in 2..m)
(((capacity-load[i,j-1] < 100) -> (collect[i,j] <= dwell[i,j]*20)) /\
((capacity-load[i,j-1] >= 100) -> (collect[i,j] <= dwell[i,j]*50)));
% (Redundant for j>=2 (but necessary for j=1))
constraint forall (i in 1..n, j in 1..m)
(collect[i,j] <= (departure[i,j]-arrival[i,j])*50);
array [1..n, 1..m] of var 0..maxTime : dwell;
constraint forall (i in 1..n, j in 1..m) (dwell[i,j] = departure[i,j] - arrival[i,j]);
int: objective_min = lb(sum(i in 1..n)(load[i,m]*arrival[i,m]));
int: objective_max = ub(sum(i in 1..n)(load[i,m]*arrival[i,m]));
var objective_min..objective_max: objective = sum(i in 1..n)(load[i,m]*arrival[i,m]);
solve
:: seq_search([
int_search(
[arrival[i,m-j+1] | j in 1..m, i in 1..n] ++
[departure[i,m-j+1] | j in 1..m, i in 1..n] ++
[sigmaUpper[i,m-j+1] | j in 1..m, i in 1..n] ++
[sigmaLower[i,m-j+1] | j in 1..m, i in 1..n],
input_order, indomain_min, complete
),
int_search(
array1d(1..n*m, collect) ++ array1d(1..n*m, load) ++ array1d(1..n*m, dwell),
first_fail, indomain_min, complete
)
])
minimize objective;
output [
"arrival = array2d(1..", show(n), ", 1..", show(m), ", ", show(arrival), ");\n",
"departure = array2d(1..", show(n), ", 1..", show(m), ", ", show(departure), ");\n",
"sigmaLower = array2d(1..", show(n), ", 1..", show(m), ", ", show(sigmaLower), ");\n",
"sigmaUpper = array2d(1..", show(n), ", 1..", show(m), ", ", show(sigmaUpper), ");\n",
"collect = array2d(1..", show(n), ", 1..", show(m), ", ", show(collect), ");\n",
"load = array2d(1..", show(n), ", 1..", show(m), ", ", show(load), ");\n",
"dwell = array2d(1..", show(n), ", 1..", show(m), ", ", show(dwell), ");\n",
"constraint objective = ", show(objective), ";\n"
];

View File

@ -1,18 +0,0 @@
comps = 1..4;
ports = 1..4;
multi_provide_ports = 1..5;
locations = 1..48;
resources = 1..1;
requirement_port_nums = [|
0,8,0,0|0,17,0,0|6,0,0,0|0,0,0,0|];
provide_port_nums = [|
-1,0,0,0,0|0,-1,-1,0,0|0,0,0,-1,0|0,0,0,0,3|];
conflicts = [|
false,false,false,false|false,false,true,false|false,false,false,false|false,false,false,false|];
multi_provides = [|
false,false,false,true|false,false,false,true|false,false,true,false|false,true,false,false|true,false,false,false|];
costs = [260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520];
resource_provisions = [|
8052|8052|8052|8052|8052|8052|8052|8052|8052|8052|8052|8052|4026|4026|4026|4026|4026|4026|4026|4026|4026|4026|4026|4026|1825|1825|1825|1825|1825|1825|1825|1825|1825|1825|1825|1825|16104|16104|16104|16104|16104|16104|16104|16104|16104|16104|16104|16104|];
resource_consumptions = [|
512|64|512|512|];

View File

@ -1,18 +0,0 @@
comps = 1..4;
ports = 1..4;
multi_provide_ports = 1..5;
locations = 1..48;
resources = 1..1;
requirement_port_nums = [|
0,6,0,0|0,13,0,0|8,0,0,0|0,0,0,0|];
provide_port_nums = [|
-1,0,0,0,0|0,-1,-1,0,0|0,0,0,-1,0|0,0,0,0,3|];
conflicts = [|
false,false,false,false|false,false,true,false|false,false,false,false|false,false,false,false|];
multi_provides = [|
false,false,false,true|false,false,false,true|false,false,true,false|false,true,false,false|true,false,false,false|];
costs = [260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520];
resource_provisions = [|
8052|8052|8052|8052|8052|8052|8052|8052|8052|8052|8052|8052|4026|4026|4026|4026|4026|4026|4026|4026|4026|4026|4026|4026|1825|1825|1825|1825|1825|1825|1825|1825|1825|1825|1825|1825|16104|16104|16104|16104|16104|16104|16104|16104|16104|16104|16104|16104|];
resource_consumptions = [|
512|64|512|512|];

View File

@ -1,18 +0,0 @@
comps = 1..4;
ports = 1..4;
multi_provide_ports = 1..5;
locations = 1..56;
resources = 1..1;
requirement_port_nums = [|
0,8,0,0|0,17,0,0|10,0,0,0|0,0,0,0|];
provide_port_nums = [|
-1,0,0,0,0|0,-1,-1,0,0|0,0,0,-1,0|0,0,0,0,3|];
conflicts = [|
false,false,false,false|false,false,true,false|false,false,false,false|false,false,false,false|];
multi_provides = [|
false,false,false,true|false,false,false,true|false,false,true,false|false,true,false,false|true,false,false,false|];
costs = [260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520];
resource_provisions = [|
8052|8052|8052|8052|8052|8052|8052|8052|8052|8052|8052|8052|8052|8052|4026|4026|4026|4026|4026|4026|4026|4026|4026|4026|4026|4026|4026|4026|1825|1825|1825|1825|1825|1825|1825|1825|1825|1825|1825|1825|1825|1825|16104|16104|16104|16104|16104|16104|16104|16104|16104|16104|16104|16104|16104|16104|];
resource_consumptions = [|
512|64|512|512|];

View File

@ -1,18 +0,0 @@
comps = 1..4;
ports = 1..4;
multi_provide_ports = 1..5;
locations = 1..56;
resources = 1..1;
requirement_port_nums = [|
0,8,0,0|0,17,0,0|6,0,0,0|0,0,0,0|];
provide_port_nums = [|
-1,0,0,0,0|0,-1,-1,0,0|0,0,0,-1,0|0,0,0,0,3|];
conflicts = [|
false,false,false,false|false,false,true,false|false,false,false,false|false,false,false,false|];
multi_provides = [|
false,false,false,true|false,false,false,true|false,false,true,false|false,true,false,false|true,false,false,false|];
costs = [260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520];
resource_provisions = [|
8052|8052|8052|8052|8052|8052|8052|8052|8052|8052|8052|8052|8052|8052|4026|4026|4026|4026|4026|4026|4026|4026|4026|4026|4026|4026|4026|4026|1825|1825|1825|1825|1825|1825|1825|1825|1825|1825|1825|1825|1825|1825|16104|16104|16104|16104|16104|16104|16104|16104|16104|16104|16104|16104|16104|16104|];
resource_consumptions = [|
512|64|512|512|];

View File

@ -1,18 +0,0 @@
comps = 1..4;
ports = 1..4;
multi_provide_ports = 1..5;
locations = 1..56;
resources = 1..1;
requirement_port_nums = [|
0,6,0,0|0,13,0,0|8,0,0,0|0,0,0,0|];
provide_port_nums = [|
-1,0,0,0,0|0,-1,-1,0,0|0,0,0,-1,0|0,0,0,0,3|];
conflicts = [|
false,false,false,false|false,false,true,false|false,false,false,false|false,false,false,false|];
multi_provides = [|
false,false,false,true|false,false,false,true|false,false,true,false|false,true,false,false|true,false,false,false|];
costs = [260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520];
resource_provisions = [|
8052|8052|8052|8052|8052|8052|8052|8052|8052|8052|8052|8052|8052|8052|4026|4026|4026|4026|4026|4026|4026|4026|4026|4026|4026|4026|4026|4026|1825|1825|1825|1825|1825|1825|1825|1825|1825|1825|1825|1825|1825|1825|16104|16104|16104|16104|16104|16104|16104|16104|16104|16104|16104|16104|16104|16104|];
resource_consumptions = [|
512|64|512|512|];

View File

@ -1,266 +0,0 @@
% Copyright (c) 2016, Jacopo Mauro. All rights reserved.
% This file is licensed under the terms of the ISC License.
% Please note that you will need to set the MiniZinc standard library
% environment variable $MZN_STDLIB_PATH to share/minizinc to include
% the MiniSearch builtins
include "lex_greatereq.mzn";
include "lex_less.mzn";
int: MAX_INT = 4096;
%%%%%%%%%%%%%%%%
% Input parameters
%%%%%%%%%%%%%%%%
% components
set of int: comps;
% ports
set of int: ports;
% multiple provide port
set of int: multi_provide_ports;
% locations
set of int: locations;
% resources
set of int: resources;
% map of components with their requirements number
array[ comps, ports] of int: requirement_port_nums;
% map of components with their provided multi-ports
% -1 means infinite multi-port provider
array[ comps, multi_provide_ports] of int: provide_port_nums;
% map of components with their conflicts
array[ comps, ports] of bool: conflicts;
% map of multi-ports with their ports
array[ multi_provide_ports, ports] of bool: multi_provides;
% map of location with their costs
array[ locations ] of int: costs;
% map of locations with the resouces they provide
array[ locations, resources ] of int: resource_provisions;
% map of components with the resources they consume
array[ comps, resources ] of int: resource_consumptions;
%%%%%%%%%%%%%%%%
% variables
%%%%%%%%%%%%%%%%
% bindings number
array[ multi_provide_ports, ports, comps, comps] of var 0..MAX_INT: bindings;
% components number
array[ comps ] of var 0..MAX_INT: comps_num;
% location to number of component map
array[ locations, comps] of var 0..MAX_INT: comp_locations;
% total number of components
var 0..MAX_INT: sum_comp;
%%%%%%%%%%%%%%%%
% constraints (no location)
%%%%%%%%%%%%%%%%
% bind the total number of components
constraint sum_comp = sum( i in comps)(comps_num[i]);
% bindings 0 if the multiprovide does not provide port
constraint forall(mport in multi_provide_ports, port in ports) (
if multi_provides[mport,port]
then true
else forall(i in comps, j in comps) ( bindings[mport,port,i,j] = 0)
endif
);
% provides must be greater or equal to bindings & infinite provide port constraints
constraint forall(mport in multi_provide_ports, pcomp in comps) (
if provide_port_nums[pcomp,mport]=0
then forall(port in ports, rcomp in comps) (
bindings[mport,port,pcomp,rcomp] = 0
)
else
if (provide_port_nums[pcomp,mport] = -1)
then forall(port in ports, rcomp in comps) (
(comps_num[pcomp] = 0) -> (bindings[mport,port,pcomp,rcomp]=0))
else sum( port in ports, rcomp in comps)(
bindings[mport,port,pcomp,rcomp] ) <= comps_num[pcomp] * provide_port_nums[pcomp,mport]
endif
endif
);
% requires must be equal to bindings
% note: here is possible to require also smaller than or equal
constraint forall(port in ports, rcomp in comps) (
sum( mport in multi_provide_ports, pcomp in comps)(
bindings[mport,port,pcomp,rcomp] ) = comps_num[rcomp] * requirement_port_nums[rcomp,port]
);
% conflict constraints if component provide same port
constraint forall(port in ports, pcomp in comps) (
if (conflicts[pcomp,port] /\ exists(mport in multi_provide_ports) (
(multi_provides[mport,port]) /\ provide_port_nums[pcomp,mport] != 0))
then comps_num[pcomp] <= 1
else true
endif
);
% conflict constraints
constraint forall(port in ports, pcomp in comps, rcomp in comps) (
if (conflicts[rcomp,port] /\ exists(mport in multi_provide_ports) (
(multi_provides[mport,port]) /\ provide_port_nums[pcomp,mport] != 0))
then comps_num[pcomp] > 0 -> comps_num[rcomp] = 0
else true
endif
);
% unicity constraint
% note that we require that a component does not
% require more than one port provided by a
% multiple provide port
constraint forall(mport in multi_provide_ports, pcomp in comps, rcomp in comps) (
let
{ int: max_req = sum(port in ports) (
if multi_provides[mport,port]
then requirement_port_nums[rcomp,port]
else 0
endif
)
} in
if pcomp = rcomp
then
( comps_num[pcomp] >= max_req ->
sum(port in ports)(bindings[mport,port,pcomp,rcomp])
<= max_req * (comps_num[rcomp] - 1))
/\
( comps_num[pcomp] < max_req ->
forall (i in 1..max_req)( comps_num[pcomp] = i ->
sum(port in ports)(bindings[mport,port,pcomp,rcomp]) <= i * (i-1) ))
else
( comps_num[pcomp] >= max_req ->
sum(port in ports)(bindings[mport,port,pcomp,rcomp])
<= max_req * comps_num[rcomp] )
/\
( comps_num[pcomp] < max_req ->
forall (i in 0..max_req)( comps_num[pcomp] = i ->
sum(port in ports)(bindings[mport,port,pcomp,rcomp]) <= i * comps_num[rcomp] ) )
endif
);
%%%%%%%%%%%%%%%%
% constraints for deciding locations
%%%%%%%%%%%%%%%%
% map location used or not used
array[ locations ] of var 0..1: used_locations;
constraint forall( l in locations)(
sum(c in comps)(comp_locations[l,c]) = 0 <-> used_locations[l] = 0
);
constraint forall( c in comps) (
sum( l in locations) ( comp_locations[l,c]) = comps_num[c]
);
constraint forall( res in resources, loc in locations) (
sum( comp in comps)( comp_locations[loc,comp] * resource_consumptions[comp,res] )
<= resource_provisions[loc,res]
);
% the number of locations can not be greater than the number of components
% i.e, one component per location in the worst case
constraint sum(i in locations) (used_locations[i]) <= sum_comp;
%------------------------------------------------------------------------------%
% symmetry constraints (wrap in a unique predicate following minizinc specs
constraint symmetry_breaking_constraint(
%if location are equal then first location has more comps than the second
%in lexicographically order (based on the cost)
forall( l1 in locations, l2 in locations)(
if l1 < l2 /\ forall ( r in resources)(resource_provisions[l1,r] = resource_provisions[l2,r] )
then
if costs[l1] > costs[l2]
then lex_greatereq(
[comp_locations[l2,c] | c in comps],
[comp_locations[l1,c] | c in comps])
/\
(used_locations[l1] = 1 -> used_locations[l2] = 1)
else
lex_greatereq(
[comp_locations[l1,c] | c in comps],
[comp_locations[l2,c] | c in comps])
/\
(used_locations[l2] = 1 -> used_locations[l1] = 1)
endif
else
true
endif
));
%------------------------------------------------------------------------------%
% Redundant constraints
%constraint redundant_constraint(
% % Ralf constraints
% forall (rcomp in comps, port in ports)(
% if requirement_port_nums[rcomp,port]!=0
% then
% comps_num[rcomp] > 0 -> sum( mport in multi_provide_ports, pcomp in comps)(
% if provide_port_nums[pcomp,mport] != 0 /\ multi_provides[mport,port]
% then comps_num[pcomp]
% else 0
% endif ) >= requirement_port_nums[rcomp,port]
% else
% true
% endif
% ));
%------------------------------------------------------------------------------%
% Constraints
constraint
( sum(l in locations)(comp_locations[l,1]) > 0
\/ sum(l in locations)(comp_locations[l,2]) > 0
)
/\ forall(x in locations)(comp_locations[x,3] < 2)
/\ forall(x in locations)(comp_locations[x,4] < 2)
;
int: obj_min = sum(l in locations)(if costs[l] < 0 then costs[l] else 0 endif);
int: obj_max = sum(l in locations)(if costs[l] > 0 then costs[l] else 0 endif);
var obj_min..obj_max: objective;
constraint objective = sum(l in locations)(used_locations[l] * costs[l]);
%------------------------------------------------------------------------------%
% Solve item
array [locations] of locations: costs_asc = arg_sort(costs);
array [locations] of locations: costs_desc = reverse(costs_asc);
solve
:: seq_search([
int_search([used_locations[costs_desc[i]] | i in locations],
input_order, indomain_min, complete),
int_search([comp_locations[l, i] | l in locations, i in comps],
first_fail, indomain_max, complete),
int_search(comps_num, first_fail, indomain_max, complete),
int_search([bindings[m,p,i,j] | m in multi_provide_ports, p in ports, i,j in comps],
first_fail, indomain_max, complete)
])
minimize objective;
%------------------------------------------------------------------------------%
% Output item
output [
"bindings = array4d(\(multi_provide_ports), \(ports), \(comps), \(comps), \(bindings));\n",
"comps_num = \(comps_num);\n",
"comp_locations = array2d(\(locations), \(comps), \(comp_locations));\n",
"used_locations = \(used_locations);\n",
"objective = \(objective);\n",
"% [\(objective), \(sum(x in locations)(sum(y in comps)(comp_locations[x,y])))]\n"
];