[CP-SAT] Add AtMostOne/AtLeastOne/ExactlyOne constraint in all languages; rewrite linear expressions in java
This commit is contained in:
@@ -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}));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user