[CP-SAT] Add AtMostOne/AtLeastOne/ExactlyOne constraint in all languages; rewrite linear expressions in java

This commit is contained in:
Laurent Perron
2022-01-03 09:43:59 +01:00
parent ce02461741
commit 62d506143b
34 changed files with 754 additions and 525 deletions

View File

@@ -30,24 +30,23 @@ public class ChannelingSampleSat {
CpModel model = new CpModel();
// Declare our two primary variables.
IntVar x = model.newIntVar(0, 10, "x");
IntVar y = model.newIntVar(0, 10, "y");
IntVar[] vars = new IntVar[] {model.newIntVar(0, 10, "x"), model.newIntVar(0, 10, "y")};
// Declare our intermediate boolean variable.
IntVar b = model.newBoolVar("b");
// Implement b == (x >= 5).
model.addGreaterOrEqual(x, 5).onlyEnforceIf(b);
model.addLessOrEqual(x, 4).onlyEnforceIf(b.not());
model.addGreaterOrEqual(vars[0], 5).onlyEnforceIf(b);
model.addLessOrEqual(vars[0], 4).onlyEnforceIf(b.not());
// Create our two half-reified constraints.
// First, b implies (y == 10 - x).
model.addEquality(LinearExpr.sum(new IntVar[] {x, y}), 10).onlyEnforceIf(b);
model.addEquality(LinearExpr.sum(vars), 10).onlyEnforceIf(b);
// Second, not(b) implies y == 0.
model.addEquality(y, 0).onlyEnforceIf(b.not());
model.addEquality(vars[1], 0).onlyEnforceIf(b.not());
// Search for x values in increasing order.
model.addDecisionStrategy(new IntVar[] {x},
model.addDecisionStrategy(new IntVar[] {vars[0]},
DecisionStrategyProto.VariableSelectionStrategy.CHOOSE_FIRST,
DecisionStrategyProto.DomainReductionStrategy.SELECT_MIN_VALUE);
@@ -75,6 +74,6 @@ public class ChannelingSampleSat {
}
private IntVar[] variableArray;
}.init(new IntVar[] {x, y, b}));
}.init(new IntVar[] {vars[0], vars[1], b}));
}
}