Skip to content

Commit

Permalink
Fix #1096
Browse files Browse the repository at this point in the history
  • Loading branch information
cprudhom committed Jun 17, 2024
1 parent 22a088f commit e7cb320
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ public class ObjectiveStrategy extends AbstractStrategy<IntVar> {
private boolean firstCall;
private DecisionOperator<IntVar> decOperator;
private final OptimizationPolicy optPolicy;

public final DecisionOperator<IntVar> decUB = new BottomUpDecisionOperator();
public final DecisionOperator<IntVar> incLB = new TopDownDecisionOperator();
//***********************************************************************************
// CONSTRUCTORS
//***********************************************************************************
Expand Down Expand Up @@ -95,34 +96,34 @@ public ObjectiveStrategy(IntVar objective, int[] coefs, OptimizationPolicy polic

private static int[] getCoefs(OptimizationPolicy policy) {
switch (policy) {
case BOTTOM_UP:
return new int[]{1, 0};
case TOP_DOWN:
return new int[]{0, 1};
case DICHOTOMIC:
return new int[]{1, 1};
default:
throw new UnsupportedOperationException("unknown OptimizationPolicy " + policy);
case BOTTOM_UP:
return new int[]{1, 0};
case TOP_DOWN:
return new int[]{0, 1};
case DICHOTOMIC:
return new int[]{1, 1};
default:
throw new UnsupportedOperationException("unknown OptimizationPolicy " + policy);
}
}

private DecisionOperator<IntVar> getOperator(OptimizationPolicy optPolicy, ResolutionPolicy resoPolicy) {
switch (optPolicy) {
case BOTTOM_UP:
return decUB;
case TOP_DOWN:
return incLB;
case DICHOTOMIC:
switch (resoPolicy) {
case MINIMIZE:
case BOTTOM_UP:
return decUB;
case MAXIMIZE:
case TOP_DOWN:
return incLB;
case DICHOTOMIC:
switch (resoPolicy) {
case MINIMIZE:
return decUB;
case MAXIMIZE:
return incLB;
default:
throw new UnsupportedOperationException("ObjectiveStrategy is not for " + resoPolicy + " ResolutionPolicy");
}
default:
throw new UnsupportedOperationException("ObjectiveStrategy is not for "+resoPolicy+" ResolutionPolicy");
}
default:
throw new UnsupportedOperationException("unknown OptimizationPolicy " + optPolicy);
throw new UnsupportedOperationException("unknown OptimizationPolicy " + optPolicy);
}
}

Expand Down Expand Up @@ -164,19 +165,19 @@ public Decision<IntVar> getDecision() {
return null;
}

if(model.getSettings().warnUser()){
if (model.getSettings().warnUser()) {
model.getSolver().log().bold().println("- objective in [" + globalLB + ", " + globalUB + "]");
}
int target;
target = (globalLB * coefLB + globalUB * coefUB) / (coefLB + coefUB);
IntDecision dec = model.getSolver().getDecisionPath().makeIntDecision(obj, decOperator, target);
if(model.getSettings().warnUser()){
if (model.getSettings().warnUser()) {
model.getSolver().log().bold().println("- trying " + obj + " " + (decOperator == decUB ? "<=" : ">=") + " " + target);
}
return dec;
}

private final DecisionOperator<IntVar> decUB = new DecisionOperator<IntVar>() {
public class BottomUpDecisionOperator implements DecisionOperator<IntVar> {
//FIXME can not serialize decision

@Override
Expand All @@ -200,9 +201,9 @@ public String toString() {
public DecisionOperator<IntVar> opposite() {
return incLB;
}
};
}

private final DecisionOperator<IntVar> incLB = new DecisionOperator<IntVar>() {
public class TopDownDecisionOperator implements DecisionOperator<IntVar> {
//FIXME can not serialize decision
@Override
public boolean apply(IntVar var, int value, ICause cause) throws ContradictionException {
Expand All @@ -225,5 +226,5 @@ public String toString() {
public DecisionOperator<IntVar> opposite() {
return decUB;
}
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import org.chocosolver.solver.Model;
import org.chocosolver.solver.constraints.nary.sat.NogoodStealer;
import org.chocosolver.solver.constraints.nary.sat.PropSat;
import org.chocosolver.solver.objective.ObjectiveStrategy;
import org.chocosolver.solver.search.strategy.assignments.DecisionOperator;
import org.chocosolver.solver.search.strategy.assignments.DecisionOperatorFactory;
import org.chocosolver.solver.search.strategy.decision.Decision;
Expand Down Expand Up @@ -140,9 +141,11 @@ private int asLit(IntVar var, DecisionOperator<IntVar> op, int val) {
l = MiniSat.makeLiteral(png.makeIntEq(var, val), false);
} else if (DecisionOperatorFactory.makeIntNeq().equals(op)) {
l = MiniSat.makeLiteral(png.makeIntEq(var, val), true);
} else if (DecisionOperatorFactory.makeIntSplit().equals(op)) {
} else if (DecisionOperatorFactory.makeIntSplit().equals(op)
|| op instanceof ObjectiveStrategy.BottomUpDecisionOperator) {
l = MiniSat.makeLiteral(png.makeIntLe(var, val), false);
} else if (DecisionOperatorFactory.makeIntReverseSplit().equals(op)) {
} else if (DecisionOperatorFactory.makeIntReverseSplit().equals(op)
|| op instanceof ObjectiveStrategy.TopDownDecisionOperator) {
l = MiniSat.makeLiteral(png.makeIntLe(var, val), true);
} else {
throw new UnsupportedOperationException("Cannot deal with such operator: " + op);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
package org.chocosolver.solver.search;


import org.chocosolver.solver.search.restart.GeometricalCutoff;
import org.chocosolver.solver.search.restart.LubyCutoff;
import org.chocosolver.solver.Model;
import org.chocosolver.solver.ResolutionPolicy;
Expand Down Expand Up @@ -470,4 +471,20 @@ public void testCP1() {
assertFalse(model.getSolver().isStopCriterionMet());
assertEquals(solver.getBestSolutionValue(), 44);
}

@Test(groups = "1s", timeOut = 60000)
public void testCP2() {
for (OptimizationPolicy p : OptimizationPolicy.values()) {
Model model = makeGolombRuler(12);
IntVar objective = (IntVar) model.getHook("objective");
model.setObjective(Model.MINIMIZE, objective);
Solver solver = model.getSolver();
solver.setSearch(Search.objectiveStrategy(objective, p), minDomUBSearch(objective));
solver.setRestarts(c -> solver.getFailCount() > c, new GeometricalCutoff(10, 1.2), 15);
solver.setNoGoodRecordingFromRestarts();
solver.showShortStatistics();
while (model.getSolver().solve()) ;
assertFalse(model.getSolver().isStopCriterionMet());
}
}
}

0 comments on commit e7cb320

Please sign in to comment.