[gecode-users] Adding variables incrementally
Malcolm Ryan
malcolmr at cse.unsw.edu.au
Mon Apr 28 02:37:58 CEST 2008
In order to save memory, I've been trying to turn my planning code
into a two stage in which the first stage only creates and constrains
a certain critical subset of variables. When all the first-stage
variables have been assigned, additional variables are created and a
second stage of search occurs. The two stages are not completely
independent however, and there may be failures in the second stage
which require backtracking into the first. This should save memeory,
since the second-stage variables don't have to be carried around
during the first-stage search.
I was hoping that I could do this simply by adding new variables and
constraints in the copy constructor at the appropriate moment, but it
seems that this does not work. I wrote a simple test case to check:
public class Test extends Space {
IntVar a, b;
public Test() {
super("test");
a = new IntVar(this, "a", 1, 4);
}
public Test(Boolean share, Test old) {
super(share, old);
a = old.a.copy(this, share);
if (a.assigned()) {
if (b == null) {
b = new IntVar(this, "b", 1, 4);
Gecode.rel(this, a, IntRelType.IRT_EQ, b);
}
else {
b = old.b.copy(this, share);
}
}
else {
b = null;
}
}
public static void main(String[] args) {
Test test = new Test();
System.out.println("Status: " + test.status());
test = (Test) test.cloneSpace();
System.out.println("Status: " + test.status());
System.out.println("a = " + test.a);
System.out.println("b = " + test.b);
Gecode.rel(test, test.a, IntRelType.IRT_EQ, 3);
System.out.println("Status: " + test.status());
System.out.println("a = " + test.a);
System.out.println("b = " + test.b);
test = (Test) test.cloneSpace();
System.out.println("Status: " + test.status());
System.out.println("a = " + test.a);
System.out.println("b = " + test.b);
Gecode.rel(test, test.b, IntRelType.IRT_EQ, 1);
System.out.println("Status: " + test.status());
System.out.println("a = " + test.a);
System.out.println("b = " + test.b);
}
}
The constraint Gecode.rel(this, a, IntRelType.IRT_EQ, b); seems to
have no effect. I can set a = 3, b = 1 and the status will still be
SS_SOLVED. I'm not entirely surprised. I presume that I am breaking
some assumptions in the system.
Is there any other way to do a two-stage search like this?
Malcolm
More information about the gecode-users
mailing list