/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.optaplanner.examples.nqueens.solver.tracking;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.optaplanner.core.api.solver.SolverFactory;
import org.optaplanner.core.config.constructionheuristic.ConstructionHeuristicPhaseConfig;
import org.optaplanner.core.config.constructionheuristic.ConstructionHeuristicType;
import org.optaplanner.core.config.heuristic.selector.entity.EntitySorterManner;
import org.optaplanner.core.config.heuristic.selector.value.ValueSorterManner;
import org.optaplanner.core.config.phase.PhaseConfig;
import org.optaplanner.core.config.solver.SolverConfig;
import org.optaplanner.core.impl.solver.DefaultSolver;
import org.optaplanner.examples.nqueens.app.NQueensApp;
import org.optaplanner.examples.nqueens.domain.NQueens;
import org.optaplanner.examples.nqueens.persistence.NQueensGenerator;
import static org.junit.Assert.*;
@RunWith(Parameterized.class)
public class NQueensConstructionHeuristicTrackingTest extends NQueensAbstractTrackingTest {
private final ConstructionHeuristicType constructionHeuristicType;
private final EntitySorterManner entitySorterManner;
private final ValueSorterManner valueSorterManner;
private final List<NQueensStepTracking> expectedCoordinates;
public NQueensConstructionHeuristicTrackingTest(ConstructionHeuristicType constructionHeuristicType,
EntitySorterManner entitySorterManner, ValueSorterManner valueSorterManner,
List<NQueensStepTracking> expectedCoordinates) {
this.constructionHeuristicType = constructionHeuristicType;
this.entitySorterManner = entitySorterManner;
this.valueSorterManner = valueSorterManner;
this.expectedCoordinates = expectedCoordinates;
}
@Test
public void trackConstructionHeuristics() {
SolverFactory<NQueens> solverFactory = SolverFactory.createFromXmlResource(NQueensApp.SOLVER_CONFIG);
SolverConfig solverConfig = solverFactory.getSolverConfig();
ConstructionHeuristicPhaseConfig chConfig = new ConstructionHeuristicPhaseConfig();
chConfig.setValueSorterManner(valueSorterManner);
chConfig.setEntitySorterManner(entitySorterManner);
chConfig.setConstructionHeuristicType(constructionHeuristicType);
solverConfig.setPhaseConfigList(Collections.<PhaseConfig>singletonList(chConfig));
NQueensGenerator generator = new NQueensGenerator();
NQueens planningProblem = generator.createNQueens(8);
NQueensStepTracker listener = new NQueensStepTracker();
DefaultSolver<NQueens> solver = (DefaultSolver<NQueens>) solverFactory.buildSolver();
solver.addPhaseLifecycleListener(listener);
NQueens bestSolution = solver.solve(planningProblem);
assertNotNull(bestSolution);
assertTrackingList(expectedCoordinates, listener.getTrackingList());
}
@Parameterized.Parameters(name = "ConstructionHeuristicType: {0}, EntitySorterManner: {1}, ValueSorterManner: {2}")
public static Collection<Object[]> parameters() {
Collection<Object[]> params = new ArrayList<>();
params.add(new Object[]{ConstructionHeuristicType.FIRST_FIT, null, null, Arrays.asList(
new NQueensStepTracking(0, 0), new NQueensStepTracking(1, 2), new NQueensStepTracking(2, 4),
new NQueensStepTracking(3, 1), new NQueensStepTracking(4, 3), new NQueensStepTracking(5, 0),
new NQueensStepTracking(6, 2), new NQueensStepTracking(7, 4))
});
params.add(new Object[]{ConstructionHeuristicType.FIRST_FIT_DECREASING, null, null, Arrays.asList(
new NQueensStepTracking(4, 0), new NQueensStepTracking(3, 2), new NQueensStepTracking(5, 3),
new NQueensStepTracking(2, 4), new NQueensStepTracking(6, 1), new NQueensStepTracking(1, 1),
new NQueensStepTracking(7, 4), new NQueensStepTracking(0, 3))
});
params.add(new Object[]{ConstructionHeuristicType.WEAKEST_FIT, null, null, Arrays.asList(
new NQueensStepTracking(0, 3), new NQueensStepTracking(1, 5), new NQueensStepTracking(2, 2),
new NQueensStepTracking(3, 4), new NQueensStepTracking(4, 1), new NQueensStepTracking(5, 7),
new NQueensStepTracking(6, 4), new NQueensStepTracking(7, 6))
});
params.add(new Object[]{ConstructionHeuristicType.WEAKEST_FIT_DECREASING, null, null, Arrays.asList(
new NQueensStepTracking(4, 3), new NQueensStepTracking(3, 5), new NQueensStepTracking(5, 1),
new NQueensStepTracking(2, 2), new NQueensStepTracking(6, 4), new NQueensStepTracking(1, 4),
new NQueensStepTracking(7, 2), new NQueensStepTracking(0, 1))
});
params.add(new Object[]{ConstructionHeuristicType.STRONGEST_FIT, null, null, Arrays.asList(
new NQueensStepTracking(0, 7), new NQueensStepTracking(1, 0), new NQueensStepTracking(2, 6),
new NQueensStepTracking(3, 1), new NQueensStepTracking(4, 5), new NQueensStepTracking(5, 7),
new NQueensStepTracking(6, 0), new NQueensStepTracking(7, 4))
});
params.add(new Object[]{ConstructionHeuristicType.STRONGEST_FIT_DECREASING, null, null, Arrays.asList(
new NQueensStepTracking(4, 7), new NQueensStepTracking(3, 0), new NQueensStepTracking(5, 1),
new NQueensStepTracking(2, 6), new NQueensStepTracking(6, 4), new NQueensStepTracking(1, 3),
new NQueensStepTracking(7, 2), new NQueensStepTracking(0, 5))
});
params.add(new Object[]{ConstructionHeuristicType.CHEAPEST_INSERTION, null, null, Arrays.asList(
new NQueensStepTracking(4, 3), new NQueensStepTracking(3, 5), new NQueensStepTracking(5, 1),
new NQueensStepTracking(2, 2), new NQueensStepTracking(6, 4), new NQueensStepTracking(1, 4),
new NQueensStepTracking(7, 2), new NQueensStepTracking(0, 1))
});
params.add(new Object[]{ConstructionHeuristicType.ALLOCATE_ENTITY_FROM_QUEUE, null, null, Arrays.asList(
new NQueensStepTracking(4, 3), new NQueensStepTracking(3, 5), new NQueensStepTracking(5, 1),
new NQueensStepTracking(2, 2), new NQueensStepTracking(6, 4), new NQueensStepTracking(1, 4),
new NQueensStepTracking(7, 2), new NQueensStepTracking(0, 1))
});
params.add(new Object[]{ConstructionHeuristicType.ALLOCATE_ENTITY_FROM_QUEUE, EntitySorterManner.NONE,
ValueSorterManner.NONE, Arrays.asList(
new NQueensStepTracking(0, 0), new NQueensStepTracking(1, 2), new NQueensStepTracking(2, 4),
new NQueensStepTracking(3, 1), new NQueensStepTracking(4, 3), new NQueensStepTracking(5, 0),
new NQueensStepTracking(6, 2), new NQueensStepTracking(7, 4))
});
params.add(new Object[]{ConstructionHeuristicType.ALLOCATE_ENTITY_FROM_QUEUE,
EntitySorterManner.DECREASING_DIFFICULTY, ValueSorterManner.NONE, Arrays.asList(
new NQueensStepTracking(4, 0), new NQueensStepTracking(3, 2), new NQueensStepTracking(5, 3),
new NQueensStepTracking(2, 4), new NQueensStepTracking(6, 1), new NQueensStepTracking(1, 1),
new NQueensStepTracking(7, 4), new NQueensStepTracking(0, 3))
});
params.add(new Object[]{ConstructionHeuristicType.ALLOCATE_ENTITY_FROM_QUEUE,
EntitySorterManner.DECREASING_DIFFICULTY_IF_AVAILABLE, ValueSorterManner.NONE, Arrays.asList(
new NQueensStepTracking(4, 0), new NQueensStepTracking(3, 2), new NQueensStepTracking(5, 3),
new NQueensStepTracking(2, 4), new NQueensStepTracking(6, 1), new NQueensStepTracking(1, 1),
new NQueensStepTracking(7, 4), new NQueensStepTracking(0, 3))
});
params.add(new Object[]{ConstructionHeuristicType.ALLOCATE_ENTITY_FROM_QUEUE, EntitySorterManner.NONE,
ValueSorterManner.INCREASING_STRENGTH, Arrays.asList(
new NQueensStepTracking(0, 3), new NQueensStepTracking(1, 5), new NQueensStepTracking(2, 2),
new NQueensStepTracking(3, 4), new NQueensStepTracking(4, 1), new NQueensStepTracking(5, 7),
new NQueensStepTracking(6, 4), new NQueensStepTracking(7, 6))
});
params.add(new Object[]{ConstructionHeuristicType.ALLOCATE_ENTITY_FROM_QUEUE, EntitySorterManner.NONE,
ValueSorterManner.DECREASING_STRENGTH, Arrays.asList(
new NQueensStepTracking(0, 7), new NQueensStepTracking(1, 0), new NQueensStepTracking(2, 6),
new NQueensStepTracking(3, 1), new NQueensStepTracking(4, 5), new NQueensStepTracking(5, 7),
new NQueensStepTracking(6, 0), new NQueensStepTracking(7, 4))
});
params.add(new Object[]{ConstructionHeuristicType.ALLOCATE_ENTITY_FROM_QUEUE,
EntitySorterManner.DECREASING_DIFFICULTY, ValueSorterManner.DECREASING_STRENGTH_IF_AVAILABLE,
Arrays.asList(
new NQueensStepTracking(4, 7), new NQueensStepTracking(3, 0), new NQueensStepTracking(5, 1),
new NQueensStepTracking(2, 6), new NQueensStepTracking(6, 4), new NQueensStepTracking(1, 3),
new NQueensStepTracking(7, 2), new NQueensStepTracking(0, 5))
});
params.add(new Object[]{ConstructionHeuristicType.ALLOCATE_ENTITY_FROM_QUEUE,
EntitySorterManner.DECREASING_DIFFICULTY, ValueSorterManner.INCREASING_STRENGTH_IF_AVAILABLE,
Arrays.asList(
new NQueensStepTracking(4, 3), new NQueensStepTracking(3, 5), new NQueensStepTracking(5, 1),
new NQueensStepTracking(2, 2), new NQueensStepTracking(6, 4), new NQueensStepTracking(1, 4),
new NQueensStepTracking(7, 2), new NQueensStepTracking(0, 1))
});
return params;
}
}