Skip to content

Commit 6d8d703

Browse files
committed
feat: bounds for taxicab distance
1 parent 5eaa42b commit 6d8d703

File tree

15 files changed

+55
-98
lines changed

15 files changed

+55
-98
lines changed

models/fzn/4x4_opt.fzn

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ var 1..4: X_INTRODUCED_77_ ::var_is_introduced :: is_defined_var;
8383
var -3..3: X_INTRODUCED_78_ ::var_is_introduced :: is_defined_var;
8484
var 1..4: X_INTRODUCED_79_ ::var_is_introduced :: is_defined_var;
8585
var -3..3: X_INTRODUCED_80_ ::var_is_introduced :: is_defined_var;
86-
var 0..90: distance:: output_var:: is_defined_var;
86+
var 49..63: distance:: is_defined_var:: output_var;
8787
var 0..3: X_INTRODUCED_82_ ::var_is_introduced :: is_defined_var;
8888
var 0..3: X_INTRODUCED_83_ ::var_is_introduced :: is_defined_var;
8989
var 0..3: X_INTRODUCED_85_ ::var_is_introduced :: is_defined_var;
@@ -1851,7 +1851,7 @@ constraint array_bool_and([X_INTRODUCED_351_,X_INTRODUCED_585_],X_INTRODUCED_102
18511851
constraint array_bool_and([X_INTRODUCED_349_,X_INTRODUCED_588_],X_INTRODUCED_1027_):: defines_var(X_INTRODUCED_1027_);
18521852
constraint array_bool_and([X_INTRODUCED_367_,X_INTRODUCED_601_],X_INTRODUCED_1029_):: defines_var(X_INTRODUCED_1029_);
18531853
constraint array_bool_and([X_INTRODUCED_365_,X_INTRODUCED_604_],X_INTRODUCED_1030_):: defines_var(X_INTRODUCED_1030_);
1854-
constraint array_bool_or([X_INTRODUCED_1012_,X_INTRODUCED_1014_,X_INTRODUCED_1015_,X_INTRODUCED_1017_,X_INTRODUCED_1018_,X_INTRODUCED_1020_,X_INTRODUCED_1021_,X_INTRODUCED_1023_,X_INTRODUCED_1024_,X_INTRODUCED_1026_,X_INTRODUCED_1027_,X_INTRODUCED_1029_,X_INTRODUCED_1030_,X_INTRODUCED_987_,X_INTRODUCED_988_,X_INTRODUCED_990_,X_INTRODUCED_991_,X_INTRODUCED_993_,X_INTRODUCED_994_,X_INTRODUCED_996_,X_INTRODUCED_997_,X_INTRODUCED_999_,X_INTRODUCED_1000_,X_INTRODUCED_1002_,X_INTRODUCED_1003_,X_INTRODUCED_1005_,X_INTRODUCED_1006_,X_INTRODUCED_1008_,X_INTRODUCED_1009_,X_INTRODUCED_1011_],X_INTRODUCED_1033_):: defines_var(X_INTRODUCED_1033_);
1854+
constraint array_bool_or([X_INTRODUCED_1009_,X_INTRODUCED_1011_,X_INTRODUCED_1012_,X_INTRODUCED_1014_,X_INTRODUCED_1015_,X_INTRODUCED_1017_,X_INTRODUCED_1018_,X_INTRODUCED_1020_,X_INTRODUCED_1021_,X_INTRODUCED_1023_,X_INTRODUCED_1024_,X_INTRODUCED_1026_,X_INTRODUCED_1027_,X_INTRODUCED_1029_,X_INTRODUCED_1030_,X_INTRODUCED_987_,X_INTRODUCED_988_,X_INTRODUCED_990_,X_INTRODUCED_991_,X_INTRODUCED_993_,X_INTRODUCED_994_,X_INTRODUCED_996_,X_INTRODUCED_997_,X_INTRODUCED_999_,X_INTRODUCED_1000_,X_INTRODUCED_1002_,X_INTRODUCED_1003_,X_INTRODUCED_1005_,X_INTRODUCED_1006_,X_INTRODUCED_1008_],X_INTRODUCED_1033_):: defines_var(X_INTRODUCED_1033_);
18551855
constraint array_bool_and([X_INTRODUCED_138_,X_INTRODUCED_383_],X_INTRODUCED_1034_):: defines_var(X_INTRODUCED_1034_);
18561856
constraint array_bool_and([X_INTRODUCED_136_,X_INTRODUCED_385_],X_INTRODUCED_1035_):: defines_var(X_INTRODUCED_1035_);
18571857
constraint array_bool_and([X_INTRODUCED_154_,X_INTRODUCED_399_],X_INTRODUCED_1037_):: defines_var(X_INTRODUCED_1037_);

models/fzn/4x4_opt.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66
%%%mzn-stat: flatIntConstraints=327
77
%%%mzn-stat: evaluatedReifiedConstraints=210
88
%%%mzn-stat: method="maximize"
9-
%%%mzn-stat: flatTime=0.324767
9+
%%%mzn-stat: flatTime=0.30666
1010
%%%mzn-stat-end
1111

models/fzn/5x5_opt.fzn

Lines changed: 5 additions & 5 deletions
Large diffs are not rendered by default.

models/fzn/5x5_opt.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66
%%%mzn-stat: flatIntConstraints=586
77
%%%mzn-stat: evaluatedHalfReifiedConstraints=432
88
%%%mzn-stat: method="maximize"
9-
%%%mzn-stat: flatTime=0.494101
9+
%%%mzn-stat: flatTime=0.485515
1010
%%%mzn-stat-end
1111

models/instances/2x2.dzn

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,6 @@ r180=[4, 3, 2, 1];
1212
r270=[2, 4, 1, 3];
1313
reflect=[2, 1, 4, 3];
1414
r180_reflect=[3, 4, 1, 2];
15-
r270_reflect=[4, 2, 3, 1];
15+
r270_reflect=[4, 2, 3, 1];
16+
d_lb=4;
17+
d_ub=5;

models/instances/3x3.dzn

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,6 @@ r180=[9, 8, 7, 6, 5, 4, 3, 2, 1];
1212
r270=[3, 6, 9, 2, 5, 8, 1, 4, 7];
1313
reflect=[3, 2, 1, 6, 5, 4, 9, 8, 7];
1414
r180_reflect=[7, 8, 9, 4, 5, 6, 1, 2, 3];
15-
r270_reflect=[9, 6, 3, 8, 5, 2, 7, 4, 1];
15+
r270_reflect=[9, 6, 3, 8, 5, 2, 7, 4, 1];
16+
d_lb=18;
17+
d_ub=24;

models/instances/4x4.dzn

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,6 @@ r180=[16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1];
1212
r270=[4, 8, 12, 16, 3, 7, 11, 15, 2, 6, 10, 14, 1, 5, 9, 13];
1313
reflect=[4, 3, 2, 1, 8, 7, 6, 5, 12, 11, 10, 9, 16, 15, 14, 13];
1414
r180_reflect=[13, 14, 15, 16, 9, 10, 11, 12, 5, 6, 7, 8, 1, 2, 3, 4];
15-
r270_reflect=[16, 12, 8, 4, 15, 11, 7, 3, 14, 10, 6, 2, 13, 9, 5, 1];
15+
r270_reflect=[16, 12, 8, 4, 15, 11, 7, 3, 14, 10, 6, 2, 13, 9, 5, 1];
16+
d_lb=49;
17+
d_ub=63;

models/instances/5x5.dzn

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,6 @@ r180=[25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6
1212
r270=[5, 10, 15, 20, 25, 4, 9, 14, 19, 24, 3, 8, 13, 18, 23, 2, 7, 12, 17, 22, 1, 6, 11, 16, 21];
1313
reflect=[5, 4, 3, 2, 1, 10, 9, 8, 7, 6, 15, 14, 13, 12, 11, 20, 19, 18, 17, 16, 25, 24, 23, 22, 21];
1414
r180_reflect=[21, 22, 23, 24, 25, 16, 17, 18, 19, 20, 11, 12, 13, 14, 15, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5];
15-
r270_reflect=[25, 20, 15, 10, 5, 24, 19, 14, 9, 4, 23, 18, 13, 8, 3, 22, 17, 12, 7, 2, 21, 16, 11, 6, 1];
15+
r270_reflect=[25, 20, 15, 10, 5, 24, 19, 14, 9, 4, 23, 18, 13, 8, 3, 22, 17, 12, 7, 2, 21, 16, 11, 6, 1];
16+
d_lb=102;
17+
d_ub=132;

models/instances/6x6.dzn

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,6 @@ r180=[36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18
1212
r270=[6, 12, 18, 24, 30, 36, 5, 11, 17, 23, 29, 35, 4, 10, 16, 22, 28, 34, 3, 9, 15, 21, 27, 33, 2, 8, 14, 20, 26, 32, 1, 7, 13, 19, 25, 31];
1313
reflect=[6, 5, 4, 3, 2, 1, 12, 11, 10, 9, 8, 7, 18, 17, 16, 15, 14, 13, 24, 23, 22, 21, 20, 19, 30, 29, 28, 27, 26, 25, 36, 35, 34, 33, 32, 31];
1414
r180_reflect=[31, 32, 33, 34, 35, 36, 25, 26, 27, 28, 29, 30, 19, 20, 21, 22, 23, 24, 13, 14, 15, 16, 17, 18, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6];
15-
r270_reflect=[36, 30, 24, 18, 12, 6, 35, 29, 23, 17, 11, 5, 34, 28, 22, 16, 10, 4, 33, 27, 21, 15, 9, 3, 32, 26, 20, 14, 8, 2, 31, 25, 19, 13, 7, 1];
15+
r270_reflect=[36, 30, 24, 18, 12, 6, 35, 29, 23, 17, 11, 5, 34, 28, 22, 16, 10, 4, 33, 27, 21, 15, 9, 3, 32, 26, 20, 14, 8, 2, 31, 25, 19, 13, 7, 1];
16+
d_lb=178;
17+
d_ub=237;

models/instances/7x7.dzn

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,6 @@ r180=[49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31
1212
r270=[7, 14, 21, 28, 35, 42, 49, 6, 13, 20, 27, 34, 41, 48, 5, 12, 19, 26, 33, 40, 47, 4, 11, 18, 25, 32, 39, 46, 3, 10, 17, 24, 31, 38, 45, 2, 9, 16, 23, 30, 37, 44, 1, 8, 15, 22, 29, 36, 43];
1313
reflect=[7, 6, 5, 4, 3, 2, 1, 14, 13, 12, 11, 10, 9, 8, 21, 20, 19, 18, 17, 16, 15, 28, 27, 26, 25, 24, 23, 22, 35, 34, 33, 32, 31, 30, 29, 42, 41, 40, 39, 38, 37, 36, 49, 48, 47, 46, 45, 44, 43];
1414
r180_reflect=[43, 44, 45, 46, 47, 48, 49, 36, 37, 38, 39, 40, 41, 42, 29, 30, 31, 32, 33, 34, 35, 22, 23, 24, 25, 26, 27, 28, 15, 16, 17, 18, 19, 20, 21, 8, 9, 10, 11, 12, 13, 14, 1, 2, 3, 4, 5, 6, 7];
15-
r270_reflect=[49, 42, 35, 28, 21, 14, 7, 48, 41, 34, 27, 20, 13, 6, 47, 40, 33, 26, 19, 12, 5, 46, 39, 32, 25, 18, 11, 4, 45, 38, 31, 24, 17, 10, 3, 44, 37, 30, 23, 16, 9, 2, 43, 36, 29, 22, 15, 8, 1];
15+
r270_reflect=[49, 42, 35, 28, 21, 14, 7, 48, 41, 34, 27, 20, 13, 6, 47, 40, 33, 26, 19, 12, 5, 46, 39, 32, 25, 18, 11, 4, 45, 38, 31, 24, 17, 10, 3, 44, 37, 30, 23, 16, 9, 2, 43, 36, 29, 22, 15, 8, 1];
16+
d_lb=294;
17+
d_ub=384;

models/nxn_opt.mzn

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ include "nxn_lock_pattern.mzn";
33
include "nxn_max_complexity.mzn";
44

55
% Maximize distance
6-
% TODO: add tight bounds for distance variable?
7-
var int: distance = sum(i in 1..m-1)(abs(dx[i]) + abs(dy[i]));
6+
int: d_lb;
7+
int: d_ub;
8+
var d_lb..d_ub: distance = sum(i in 1..m-1)(abs(dx[i]) + abs(dy[i]));
89
solve maximize distance;
910
output ["pattern=\(p)", "\n", "distance=\(distance)"];

models/nxn_sat.mzn

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,8 @@ include "nxn_lock_pattern.mzn";
33
include "nxn_max_complexity.mzn";
44

55
% Find max complexity patterns
6+
int: d_lb;
7+
int: d_ub;
8+
% var d_lb..d_ub: distance = sum(i in 1..m-1)(abs(dx[i]) + abs(dy[i]));
69
solve satisfy;
710
output ["pattern=\(p)", "\n", "distance=\(sum(i in 1..m-1)(abs(dx[i]) + abs(dy[i])))"];

plots/2x2/10536221011707868821.svg

Lines changed: 0 additions & 37 deletions
This file was deleted.

plots/2x2/16983581020430133341.svg

Lines changed: 0 additions & 37 deletions
This file was deleted.

src/functions.jl

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,27 +36,42 @@ end
3636

3737
function symmetries(n::Int)
3838
# Horizontal reflection
39-
reflect = [j + i*n for i in 0:n-1 for j in n:-1:1]
39+
reflect = [j + i * n for i = 0:n-1 for j = n:-1:1]
4040
# Rotate 90 degrees
41-
r90 = [j + i*n for j in 1:n for i in n-1:-1:0]
41+
r90 = [j + i * n for j = 1:n for i = n-1:-1:0]
4242
r180 = r90[r90]
4343
r270 = r180[r90]
4444
r180_reflect = r180[reflect]
4545
r270_reflect = r270[reflect]
4646
return r90, r180, r270, reflect, r180_reflect, r270_reflect
4747
end
4848

49+
"""Upper and lower bound for taxicab distance."""
50+
function bounds(n::Int)
51+
M = n^2 - 1
52+
ys, xs, ks = line_types(n)
53+
# Taxicab distance of each line type
54+
x = abs.(ys) + abs.(xs)
55+
# Taxicab distance of shortest unique line types
56+
d_lb = sum(sort(x)[1:M])
57+
# Taxicab distance of longest unique line types
58+
d_ub = sum(reverse(sort(x .* ks))[1:M])
59+
return d_lb, d_ub
60+
end
61+
4962
function data(n::Int)
5063
m = n^2
5164
M = m - 1
5265
x, y = grid(n)
5366
xs, ys, ks = line_types(n)
5467
N = length(ks)
5568
r90, r180, r270, reflect, r180_reflect, r270_reflect = symmetries(n)
56-
return ["n=$n;", "m=$m;", "x=$x;", "y=$y;", "M=$M;", "N=$N;",
57-
"xs=$(xs);", "ys=$(ys);", "ks=$(ks);",
58-
"r90=$r90;", "r180=$r180;", "r270=$r270;", "reflect=$reflect;",
59-
"r180_reflect=$r180_reflect;", "r270_reflect=$r270_reflect;"]
69+
d_lb, d_ub = bounds(n)
70+
return ["n=$n;", "m=$m;", "x=$x;", "y=$y;", "M=$M;", "N=$N;",
71+
"xs=$(xs);", "ys=$(ys);", "ks=$(ks);",
72+
"r90=$r90;", "r180=$r180;", "r270=$r270;", "reflect=$reflect;",
73+
"r180_reflect=$r180_reflect;", "r270_reflect=$r270_reflect;",
74+
"d_lb=$d_lb;", "d_ub=$d_ub;"]
6075
end
6176

6277
function line_type(x1::Int, x2::Int, y1::Int, y2::Int)
@@ -70,7 +85,7 @@ function line_type(x1::Int, x2::Int, y1::Int, y2::Int)
7085
end
7186
end
7287

73-
function parse_int_array(x::AbstractString; I=Int)
88+
function parse_int_array(x::AbstractString; I = Int)
7489
[parse(I, t.match) for t in eachmatch(r"([0-9]+)", x)]
7590
end
7691

0 commit comments

Comments
 (0)