public Acceptor buildAcceptor(HeuristicConfigPolicy configPolicy) {
EnvironmentMode environmentMode = configPolicy.getEnvironmentMode();
List<Acceptor> acceptorList = new ArrayList<Acceptor>();
if (acceptorClassList != null) {
for (Class<? extends Acceptor> acceptorClass : acceptorClassList) {
Acceptor acceptor = ConfigUtils.newInstance(this, "acceptorClass", acceptorClass);
acceptorList.add(acceptor);
}
}
if (acceptorTypeList != null && acceptorTypeList.contains(AcceptorType.HILL_CLIMBING)) {
HillClimbingAcceptor acceptor = new HillClimbingAcceptor();
acceptorList.add(acceptor);
}
if ((acceptorTypeList != null && acceptorTypeList.contains(AcceptorType.ENTITY_TABU))
|| entityTabuSize != null || entityTabuRatio != null
|| fadingEntityTabuSize != null || fadingEntityTabuRatio != null) {
EntityTabuAcceptor acceptor = new EntityTabuAcceptor();
if (entityTabuSize != null) {
if (entityTabuRatio != null) {
throw new IllegalArgumentException("The acceptor cannot have both entityTabuSize ("
+ entityTabuSize + ") and entityTabuRatio (" + entityTabuRatio + ").");
}
acceptor.setTabuSizeStrategy(new FixedTabuSizeStrategy(entityTabuSize));
} else if (entityTabuRatio != null) {
acceptor.setTabuSizeStrategy(new EntityRatioTabuSizeStrategy(entityTabuRatio));
}
if (fadingEntityTabuSize != null) {
if (fadingEntityTabuRatio != null) {
throw new IllegalArgumentException("The acceptor cannot have both fadingEntityTabuSize ("
+ fadingEntityTabuSize + ") and fadingEntityTabuRatio ("
+ fadingEntityTabuRatio + ").");
}
acceptor.setFadingTabuSizeStrategy(new FixedTabuSizeStrategy(fadingEntityTabuSize));
} else if (fadingEntityTabuRatio != null) {
acceptor.setFadingTabuSizeStrategy(new EntityRatioTabuSizeStrategy(fadingEntityTabuRatio));
}
if (environmentMode.isNonIntrusiveFullAsserted()) {
acceptor.setAssertTabuHashCodeCorrectness(true);
}
acceptorList.add(acceptor);
}
if ((acceptorTypeList != null && acceptorTypeList.contains(AcceptorType.VALUE_TABU))
|| valueTabuSize != null || valueTabuRatio != null
|| fadingValueTabuSize != null || fadingValueTabuRatio != null) {
ValueTabuAcceptor acceptor = new ValueTabuAcceptor();
if (valueTabuSize != null) {
if (valueTabuRatio != null) {
throw new IllegalArgumentException("The acceptor cannot have both valueTabuSize ("
+ valueTabuSize + ") and valueTabuRatio (" + valueTabuRatio + ").");
}
acceptor.setTabuSizeStrategy(new FixedTabuSizeStrategy(valueTabuSize));
} else if (valueTabuRatio != null) {
acceptor.setTabuSizeStrategy(new ValueRatioTabuSizeStrategy(valueTabuRatio));
}
if (fadingValueTabuSize != null) {
if (fadingValueTabuRatio != null) {
throw new IllegalArgumentException("The acceptor cannot have both fadingValueTabuSize ("
+ fadingValueTabuSize + ") and fadingValueTabuRatio ("
+ fadingValueTabuRatio + ").");
}
acceptor.setFadingTabuSizeStrategy(new FixedTabuSizeStrategy(fadingValueTabuSize));
} else if (fadingValueTabuRatio != null) {
acceptor.setFadingTabuSizeStrategy(new ValueRatioTabuSizeStrategy(fadingValueTabuRatio));
}
if (valueTabuSize != null) {
acceptor.setTabuSizeStrategy(new FixedTabuSizeStrategy(valueTabuSize));
}
if (fadingValueTabuSize != null) {
acceptor.setFadingTabuSizeStrategy(new FixedTabuSizeStrategy(fadingValueTabuSize));
}
if (environmentMode.isNonIntrusiveFullAsserted()) {
acceptor.setAssertTabuHashCodeCorrectness(true);
}
acceptorList.add(acceptor);
}
if ((acceptorTypeList != null && acceptorTypeList.contains(AcceptorType.MOVE_TABU))
|| moveTabuSize != null || fadingMoveTabuSize != null) {
MoveTabuAcceptor acceptor = new MoveTabuAcceptor();
acceptor.setUseUndoMoveAsTabuMove(false);
if (moveTabuSize != null) {
acceptor.setTabuSizeStrategy(new FixedTabuSizeStrategy(moveTabuSize));
}
if (fadingMoveTabuSize != null) {
acceptor.setFadingTabuSizeStrategy(new FixedTabuSizeStrategy(fadingMoveTabuSize));
}
if (environmentMode.isNonIntrusiveFullAsserted()) {
acceptor.setAssertTabuHashCodeCorrectness(true);
}
acceptorList.add(acceptor);
}
if ((acceptorTypeList != null && acceptorTypeList.contains(AcceptorType.UNDO_MOVE_TABU))
|| undoMoveTabuSize != null || fadingUndoMoveTabuSize != null) {
MoveTabuAcceptor acceptor = new MoveTabuAcceptor();
acceptor.setUseUndoMoveAsTabuMove(true);
if (undoMoveTabuSize != null) {
acceptor.setTabuSizeStrategy(new FixedTabuSizeStrategy(undoMoveTabuSize));
}
if (fadingUndoMoveTabuSize != null) {
acceptor.setFadingTabuSizeStrategy(new FixedTabuSizeStrategy(fadingUndoMoveTabuSize));
}
if (environmentMode.isNonIntrusiveFullAsserted()) {
acceptor.setAssertTabuHashCodeCorrectness(true);
}
acceptorList.add(acceptor);
}
if ((acceptorTypeList != null && acceptorTypeList.contains(AcceptorType.SOLUTION_TABU))
|| solutionTabuSize != null || fadingSolutionTabuSize != null) {
SolutionTabuAcceptor acceptor = new SolutionTabuAcceptor();
if (solutionTabuSize != null) {
acceptor.setTabuSizeStrategy(new FixedTabuSizeStrategy(solutionTabuSize));
}
if (fadingSolutionTabuSize != null) {
acceptor.setFadingTabuSizeStrategy(new FixedTabuSizeStrategy(fadingSolutionTabuSize));
}
if (environmentMode.isNonIntrusiveFullAsserted()) {
acceptor.setAssertTabuHashCodeCorrectness(true);
}
acceptorList.add(acceptor);
}
if ((acceptorTypeList != null && acceptorTypeList.contains(AcceptorType.SIMULATED_ANNEALING))
|| simulatedAnnealingStartingTemperature != null) {
SimulatedAnnealingAcceptor acceptor = new SimulatedAnnealingAcceptor();
acceptor.setStartingTemperature(configPolicy.getScoreDefinition()
.parseScore(simulatedAnnealingStartingTemperature));
acceptorList.add(acceptor);
}
if ((acceptorTypeList != null && acceptorTypeList.contains(AcceptorType.LATE_ACCEPTANCE))
|| lateAcceptanceSize != null) {
LateAcceptanceAcceptor acceptor = new LateAcceptanceAcceptor();
acceptor.setLateAcceptanceSize((lateAcceptanceSize == null) ? 1000 : lateAcceptanceSize);
acceptorList.add(acceptor);
}
if ((acceptorTypeList != null && acceptorTypeList.contains(AcceptorType.STEP_COUNTING_HILL_CLIMBING))
|| stepCountingHillClimbingSize != null) {
int stepCountingHillClimbingSize_ = (stepCountingHillClimbingSize == null)
? 1000 : stepCountingHillClimbingSize;
StepCountingHillClimbingType stepCountingHillClimbingType_ = (stepCountingHillClimbingType == null)
? StepCountingHillClimbingType.STEP : stepCountingHillClimbingType;
StepCountingHillClimbingAcceptor acceptor = new StepCountingHillClimbingAcceptor(
stepCountingHillClimbingSize_, stepCountingHillClimbingType_);
acceptorList.add(acceptor);
}
if ((acceptorTypeList != null && acceptorTypeList.contains(AcceptorType.LATE_SIMULATED_ANNEALING))
|| lateSimulatedAnnealingSize != null) {
LateSimulatedAnnealingAcceptor acceptor = new LateSimulatedAnnealingAcceptor();
acceptor.setLateSimulatedAnnealingSize((lateSimulatedAnnealingSize == null) ? 1000 : lateSimulatedAnnealingSize);
acceptorList.add(acceptor);
}
if (acceptorList.size() == 1) {
return acceptorList.get(0);
} else if (acceptorList.size() > 1) {