package edu.neu.ccs.evergreen.state; import java.util.Random; import org.apache.log4j.Logger; import edu.neu.ccs.evergreen.exception.ContradictionException; import edu.neu.ccs.evergreen.model.Assignment; import edu.neu.ccs.evergreen.model.Assignments; import edu.neu.ccs.evergreen.model.Constraint; import edu.neu.ccs.evergreen.model.State; /** * Use a biased coin to decide if the next variable is true or false. */ public abstract class BiasNextState implements NextState { private static final Logger LOGGER = Logger.getLogger(BiasNextState.class); protected Random random; protected double refresh = 0.5; protected boolean doRefresh = true; protected double bias; abstract protected boolean doRefresh(); abstract protected double calculateBias(State state, int maxOriginalVariable, Assignments bestAssignments); /** * @see edu.neu.ccs.evergreen.state.NextState#getNextState(edu.neu.ccs.evergreen.model.State, * int, edu.neu.ccs.evergreen.model.Assignments) */ public State getNextState(State state, int maxOriginalVariable, Assignments bestAssignments) { if (doRefresh()) { bias = calculateBias(state, maxOriginalVariable, bestAssignments ); doRefresh = false; LOGGER.debug("Bias refreshed and is now " + bias + " which solves " + state.satisfiedPercentage(bias)); } // TODO maybe track set of unavailable variables for (int variable = 1; variable <= maxOriginalVariable; variable++) { if (state.unassigned(variable)) { State testState = state.clone(); int value = 0; try { // if bias = 1 we always set true, that's why <= if (random.nextDouble() < bias) { value = 1; } LOGGER.trace("Trying " + variable + "=" + value); testState.addAssignment(new Assignment(variable, value)); } catch (ContradictionException contradictionException) { LOGGER.trace(variable + "=" + value + " caused contradiction"); Constraint errorConstraint = contradictionException .getConstraint(); throw new ContradictionException("Variable " + variable + " leads to a contradiction", testState, errorConstraint); } return testState; } } LOGGER.debug("No unassigned variables"); throw new ContradictionException("No unassigned variables"); } /** * @see edu.neu.ccs.evergreen.state.NextState#initBestAssignments(edu.neu.ccs.evergreen.model.State) */ public Assignments initBestAssignments(State state) { // Ignore return null; } /** * @see edu.neu.ccs.evergreen.state.NextState#updateBestAssignments(edu.neu.ccs.evergreen.model.State, edu.neu.ccs.evergreen.model.Assignments) */ public Assignments updateBestAssignments(State state, Assignments bestAssignments) { // Ignore return null; } }