Cream has no disjunctive constraints, such as
(x > 0) or (y > 0)
.
However, you can encode it in Cream as follows.
Or, you can simply use x.max(y).gt(0)
in this case.
Network net = new Network(); IntVariable x = new IntVariable(net, -1, 1, "x"); IntVariable y = new IntVariable(net, -1, 1, "y"); // x > 0 or y > 0 IntVariable c1 = x.sign().max(0); IntVariable c2 = y.sign().max(0); // c1 or c2 --> c1 max c2 c1.max(c2).gt(0);
Cream has no conditional constraints, such as
if (x > 0) then (y > 0) else (z > 0)
.
However, you can encode it in Cream as follows.
Network net = new Network(); IntVariable x = new IntVariable(net, 0, 1, "x"); IntVariable y = new IntVariable(net, 0, 1, "y"); IntVariable z = new IntVariable(net, 0, 1, "z"); // if x > 0 then y > 0 else z > 0 IntVariable c1 = x.sign().max(0); IntVariable c2 = y.sign().max(0); IntVariable c3 = z.sign().max(0); // if c1 then c2 else c3 // --> (c1 and c2) or (not c1 and c3) // --> (c1 min c2) max (1-c1 min c3) c1.min(c2).max(c1.negate().add(1).min(c3)).gt(0);
Cream does not support soft constraints directly.
However, you can encode them in some cases.
Suppose you have a set of soft constraints
x1<=0, x2<=0, ..., xn<=0
.
They can be expressed in Cream as follows (but, perhaps not efficient).
IntVariable w1 = x1.sign().max(0); IntVariable w2 = x2.sign().max(0); ... IntVariable wn = x3.sign().max(0); IntVariable w = w1.add(w2)....add(wn); net.setObjective(w); int opt = Solver.MAXIMIZE | Solver.BETTER; Solver solver = new DefaultSolver(net, opt);
Yes, but you need to start a new solver after adding constraints.
If you want to find a similar solution after adding constraints,
please refer to neighborhoodSearchExample()
in Examples.java.
Yes. The following example declares an integer variable "x" with the domain {1,2,4,8}.
IntDomain d = new IntDomain(1, 7).delete(3).delete(5, 7); IntVariable x = new IntVariable(net, d, "x");