You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

152 lines
4.8 KiB

/* Graceful Tree Labeling Problem */
/* Author: Mike Appleby <mike@app.leby.org> */
/* The Graceful Labeling Problem for a tree G = (V, E), where V is the
set of vertices and E is the set of edges, is to find a labeling of
the vertices with the integers between 1 and |V| inclusive, such
that no two vertices share a label, and such that each edge is
uniquely identified by the positive, or absolute difference between
the labels of its endpoints.
In other words, if vl are the vertex labels and el are the edge
labels, then for every edge (u,v) in E, el[u,v]=abs(vl[u] - vl[v]).
https://en.wikipedia.org/wiki/Graceful_labeling */
set V;
/* set of vertices */
set E within V cross V;
/* set of edges */
set N := 1..card(V);
/* vertex labels */
set M := 1..card(V)-1;
/* edge labels */
var vx{V, N}, binary;
/* binary encoding of vertex labels.
vx[v,n] == 1 means vertex v has label n. */
s.t. vxa{v in V}: sum{n in N} vx[v,n] = 1;
/* each vertex is assigned exactly one label. */
s.t. vxb{n in N}: sum{v in V} vx[v,n] = 1;
/* each label is assigned to exactly one vertex. */
var vl{V}, integer, >= 1, <= card(V);
/* integer encoding of vertex labels.
vl[v] == n means vertex v has label n. */
s.t. vla{v in V}: vl[v] = sum{n in N} n * vx[v,n];
/* by constraint vxa, exactly one of vx[v,n] == 1 and the rest are
zero. So if vx[v,3] == 1, then vl[v] = 3. */
var ex{E, M}, binary;
/* binary encoding of edge labels.
ex[u,v,n] == 1 means edge (u,v) has label n. */
s.t. exa{(u,v) in E}: sum{m in M} ex[u,v,m] = 1;
/* each edge is assigned exactly one label. */
s.t. exb{m in M}: sum{(u,v) in E} ex[u,v,m] = 1;
/* each label is assigned to exactly one edge. */
var el{E}, integer, >= 1, <= card(E);
/* integer encoding of edge labels.
el[u,v] == n means edge (u,v) has label n. */
s.t. ela{(u,v) in E}: el[u,v] = sum{m in M} m * ex[u,v,m];
/* similar to vla above, define integer encoding of edge labels in
terms of the corresponding binary variable. */
var gt{E}, binary;
/* gt[u,v] = 1 if vl[u] > vl[v] else 0.
gt helps encode the absolute value constraint, below. */
s.t. elb{(u,v) in E}: el[u,v] >= vl[u] - vl[v];
s.t. elc{(u,v) in E}: el[u,v] <= vl[u] - vl[v] + 2*card(V)*(1-gt[u,v]);
s.t. eld{(u,v) in E}: el[u,v] >= vl[v] - vl[u];
s.t. ele{(u,v) in E}: el[u,v] <= vl[v] - vl[u] + 2*card(V)*gt[u,v];
/* These four constraints together model the absolute value constraint
of the graceful labeling problem: el[u,v] == abs(vl[u] - vl[v]).
However, since the absolute value is a non-linear function, we
transform it into a series of linear constraints, as above.
To see that these four constraints model the absolute value
condition, consider the following cases:
if vl[u] > vl[v] and gt[u,v] == 0 then
- ele is unsatisfiable, since the constraint ele amounts to
el[u,v] <= vl[v] - vl[u] + 0 (since gt[u,v] == 0)
<= -1 (since vl[u] > vl[v])
but el[u,v] is declared with lower bound >= 1; hence, the
constraints cannot be satisfied if vl[u] > vl[v] and
gt[u,v] == 0.
if vl[u] > vl[v] and gt[u,v] == 1 then
- elb and elc together are equivalent to
vl[u] - vl[v] <= el[u,v] <= vl[u] - vl[v], i.e.
el[u,v] = vl[u] - vl[v]
= abs(vl[u] - vl[v]) (since vl[u] > vl[v])
- eld and elc together are equivalent to
vl[v] - vl[u] <= el[u,v] <= vl[v] - vl[u] + 2|V|
the tightest possible bounds are
-1 <= el[u,v] <= |V|+1
which is satisfied since both bounds are looser than the
constraints on el's variable declaration, namely
var el{E}, integer, >= 1, <= card(E);
where |E| = |V|-1
The cases for vl[v] > vl[u] are similar, but with roles reversed
for elb/elc and eld/ele.
In other words, when vl[u] > vl[v], then gt[u,v] == 1, elb and elc
together model the absolute value constraint, and ele and eld are
satisfied due to bounds constraints on el. When vl[v] > vl[u], then
gt[u,v] == 0, ele and eld model the absolute value constraint, and
elb and elc are satisfied due to bounds constraints on el.
Note that vl[u] != vl[v], by a combination of constraints vxa, vxb,
and vla. */
solve;
check 0 = card(N symdiff setof{v in V} vl[v]);
/* every vertex label is assigned to one vertex */
check 0 = card(M symdiff setof{(u,v) in E} el[u,v]);
/* every edge label is assigned to one edge */
check {(u,v) in E} el[u,v] = abs(vl[u] - vl[v]);
/* every edge label for every edge (u,v) == abs(vl[u] - vl[v]) */
printf "vertices:\n";
for{v in V} { printf "\t%s: %d\n", v, vl[v]; }
printf "edges:\n";
printf "\torig\tvlabel\telabel\tabs(u-v)\n";
for{(u,v) in E} {
printf "\t(%s,%s)\t(%d,%d)\t%d\t%d\n",
u, v, vl[u], vl[v], el[u,v], abs(vl[u]-vl[v]);
}
data;
set V := a b c d e f g;
set E := a b, a d, a g, b c, b e, e f;
end;