Skip to content

Commit 96315f1

Browse files
committed
chore: enable nearby for sublist move
1 parent 233155e commit 96315f1

File tree

1 file changed

+118
-2
lines changed

1 file changed

+118
-2
lines changed

core/src/test/java/ai/timefold/solver/core/impl/solver/DefaultSolverTest.java

Lines changed: 118 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,10 @@
4747
import ai.timefold.solver.core.config.heuristic.selector.move.generic.ChangeMoveSelectorConfig;
4848
import ai.timefold.solver.core.config.heuristic.selector.move.generic.PillarChangeMoveSelectorConfig;
4949
import ai.timefold.solver.core.config.heuristic.selector.move.generic.PillarSwapMoveSelectorConfig;
50+
import ai.timefold.solver.core.config.heuristic.selector.move.generic.RuinRecreateMoveSelectorConfig;
5051
import ai.timefold.solver.core.config.heuristic.selector.move.generic.SwapMoveSelectorConfig;
52+
import ai.timefold.solver.core.config.heuristic.selector.move.generic.chained.SubChainChangeMoveSelectorConfig;
53+
import ai.timefold.solver.core.config.heuristic.selector.move.generic.chained.SubChainSwapMoveSelectorConfig;
5154
import ai.timefold.solver.core.config.heuristic.selector.move.generic.chained.TailChainSwapMoveSelectorConfig;
5255
import ai.timefold.solver.core.config.heuristic.selector.move.generic.list.ListChangeMoveSelectorConfig;
5356
import ai.timefold.solver.core.config.heuristic.selector.move.generic.list.ListRuinRecreateMoveSelectorConfig;
@@ -56,6 +59,7 @@
5659
import ai.timefold.solver.core.config.heuristic.selector.move.generic.list.SubListSwapMoveSelectorConfig;
5760
import ai.timefold.solver.core.config.heuristic.selector.move.generic.list.kopt.KOptListMoveSelectorConfig;
5861
import ai.timefold.solver.core.config.heuristic.selector.value.ValueSelectorConfig;
62+
import ai.timefold.solver.core.config.heuristic.selector.value.chained.SubChainSelectorConfig;
5963
import ai.timefold.solver.core.config.localsearch.LocalSearchPhaseConfig;
6064
import ai.timefold.solver.core.config.localsearch.LocalSearchType;
6165
import ai.timefold.solver.core.config.phase.custom.CustomPhaseConfig;
@@ -1418,8 +1422,121 @@ void solveCustomConfigListVariable() {
14181422
.isEmpty();
14191423
}
14201424

1425+
private static List<MoveSelectorConfig> generateMovesSingleVarModel() {
1426+
var allMoveSelectionConfigList = new ArrayList<MoveSelectorConfig>();
1427+
// Change - basic
1428+
allMoveSelectionConfigList.add(new ChangeMoveSelectorConfig());
1429+
// Swap - basic
1430+
allMoveSelectionConfigList.add(new SwapMoveSelectorConfig());
1431+
// Pillar change - basic
1432+
allMoveSelectionConfigList.add(new PillarChangeMoveSelectorConfig());
1433+
// Pilar swap - basic
1434+
allMoveSelectionConfigList.add(new PillarSwapMoveSelectorConfig());
1435+
// R&R - basic
1436+
allMoveSelectionConfigList.add(new RuinRecreateMoveSelectorConfig());
1437+
// Union of all moves
1438+
allMoveSelectionConfigList.add(new UnionMoveSelectorConfig(List.copyOf(allMoveSelectionConfigList)));
1439+
return allMoveSelectionConfigList;
1440+
}
1441+
1442+
@ParameterizedTest
1443+
@MethodSource("generateMovesSingleVarModel")
1444+
void solveMoveConfigSingleVar(MoveSelectorConfig moveSelectionConfig) {
1445+
// Local search
1446+
var localSearchConfig =
1447+
new LocalSearchPhaseConfig()
1448+
.withMoveSelectorConfig(moveSelectionConfig)
1449+
.withTerminationConfig(new TerminationConfig().withMoveCountLimit(40L));
1450+
// Solver config
1451+
var solverConfig = PlannerTestUtils.buildSolverConfig(
1452+
TestdataSolution.class, TestdataEntity.class)
1453+
.withPhases(new ConstructionHeuristicPhaseConfig(), localSearchConfig)
1454+
.withEasyScoreCalculatorClass(DummySimpleScoreEasyScoreCalculator.class);
1455+
1456+
var problem = TestdataSolution.generateUninitializedSolution(2, 2);
1457+
assertThatCode(() -> PlannerTestUtils.solve(solverConfig, problem))
1458+
.doesNotThrowAnyException();
1459+
}
1460+
1461+
private static List<MoveSelectorConfig> generateMovesChainedVarModel() {
1462+
var allMoveSelectionConfigList = new ArrayList<MoveSelectorConfig>();
1463+
// Change - chained
1464+
allMoveSelectionConfigList.add(new ChangeMoveSelectorConfig());
1465+
// Swap - chained
1466+
allMoveSelectionConfigList.add(new SwapMoveSelectorConfig());
1467+
// Tail Chain - chained
1468+
allMoveSelectionConfigList.add(new TailChainSwapMoveSelectorConfig()
1469+
.withValueSelectorConfig(new ValueSelectorConfig().withVariableName("chainedObject")));
1470+
// Subchain chain - chained
1471+
allMoveSelectionConfigList
1472+
.add(new SubChainChangeMoveSelectorConfig().withSubChainSelectorConfig(new SubChainSelectorConfig()
1473+
.withValueSelectorConfig(new ValueSelectorConfig().withVariableName("chainedObject")))
1474+
.withValueSelectorConfig(new ValueSelectorConfig().withVariableName("chainedObject")));
1475+
// Subchain swap - chained
1476+
allMoveSelectionConfigList
1477+
.add(new SubChainSwapMoveSelectorConfig().withSubChainSelectorConfig(new SubChainSelectorConfig()
1478+
.withValueSelectorConfig(new ValueSelectorConfig().withVariableName("chainedObject"))));
1479+
// Union of all moves
1480+
allMoveSelectionConfigList.add(new UnionMoveSelectorConfig(List.copyOf(allMoveSelectionConfigList)));
1481+
return allMoveSelectionConfigList;
1482+
}
1483+
1484+
@ParameterizedTest
1485+
@MethodSource("generateMovesChainedVarModel")
1486+
void solveMoveConfigChainedVar(MoveSelectorConfig moveSelectionConfig) {
1487+
// Local search
1488+
var localSearchConfig =
1489+
new LocalSearchPhaseConfig()
1490+
.withMoveSelectorConfig(moveSelectionConfig)
1491+
.withTerminationConfig(new TerminationConfig().withMoveCountLimit(40L));
1492+
// Solver config
1493+
var solverConfig = PlannerTestUtils.buildSolverConfig(
1494+
TestdataChainedSolution.class, TestdataChainedEntity.class)
1495+
.withPhases(new ConstructionHeuristicPhaseConfig(), localSearchConfig)
1496+
.withEasyScoreCalculatorClass(DummySimpleScoreEasyScoreCalculator.class);
1497+
1498+
var problem = TestdataChainedSolution.generateUninitializedSolution(2, 2);
1499+
assertThatCode(() -> PlannerTestUtils.solve(solverConfig, problem))
1500+
.doesNotThrowAnyException();
1501+
}
1502+
1503+
private static List<MoveSelectorConfig> generateMovesListVarModel() {
1504+
var allMoveSelectionConfigList = new ArrayList<MoveSelectorConfig>();
1505+
// Change - basic
1506+
allMoveSelectionConfigList.add(new ListChangeMoveSelectorConfig());
1507+
// Swap - basic
1508+
allMoveSelectionConfigList.add(new ListSwapMoveSelectorConfig());
1509+
// Pillar change - basic
1510+
allMoveSelectionConfigList.add(new SubListChangeMoveSelectorConfig());
1511+
// Pilar swap - basic
1512+
allMoveSelectionConfigList.add(new SubListSwapMoveSelectorConfig());
1513+
// R&R - basic
1514+
allMoveSelectionConfigList.add(new ListRuinRecreateMoveSelectorConfig());
1515+
// Union of all moves
1516+
allMoveSelectionConfigList.add(new UnionMoveSelectorConfig(List.copyOf(allMoveSelectionConfigList)));
1517+
return allMoveSelectionConfigList;
1518+
}
1519+
1520+
@ParameterizedTest
1521+
@MethodSource("generateMovesListVarModel")
1522+
void solveMoveConfigListVar(MoveSelectorConfig moveSelectionConfig) {
1523+
// Local search
1524+
var localSearchConfig =
1525+
new LocalSearchPhaseConfig()
1526+
.withMoveSelectorConfig(moveSelectionConfig)
1527+
.withTerminationConfig(new TerminationConfig().withMoveCountLimit(40L));
1528+
// Solver config
1529+
var solverConfig = PlannerTestUtils.buildSolverConfig(
1530+
TestdataListSolution.class, TestdataListEntity.class, TestdataListValue.class)
1531+
.withPhases(new ConstructionHeuristicPhaseConfig(), localSearchConfig)
1532+
.withEasyScoreCalculatorClass(DummySimpleScoreEasyScoreCalculator.class);
1533+
1534+
var problem = TestdataListSolution.generateUninitializedSolution(2, 2);
1535+
assertThatCode(() -> PlannerTestUtils.solve(solverConfig, problem))
1536+
.doesNotThrowAnyException();
1537+
}
1538+
14211539
private static List<MoveSelectorConfig> generateMovesMultiVarModel() {
1422-
// Local Search
14231540
var allMoveSelectionConfigList = new ArrayList<MoveSelectorConfig>();
14241541
// Change - basic
14251542
allMoveSelectionConfigList.add(new ChangeMoveSelectorConfig());
@@ -1462,7 +1579,6 @@ void solveMoveConfigMultiVar(MoveSelectorConfig moveSelectionConfig) {
14621579
}
14631580

14641581
private static List<MoveSelectorConfig> generateMovesMultiEntityModel() {
1465-
// Local Search
14661582
var allMoveSelectionConfigList = new ArrayList<MoveSelectorConfig>();
14671583
// Change - basic
14681584
allMoveSelectionConfigList.add(new ChangeMoveSelectorConfig());

0 commit comments

Comments
 (0)