|
47 | 47 | import ai.timefold.solver.core.config.heuristic.selector.move.generic.ChangeMoveSelectorConfig;
|
48 | 48 | import ai.timefold.solver.core.config.heuristic.selector.move.generic.PillarChangeMoveSelectorConfig;
|
49 | 49 | import ai.timefold.solver.core.config.heuristic.selector.move.generic.PillarSwapMoveSelectorConfig;
|
| 50 | +import ai.timefold.solver.core.config.heuristic.selector.move.generic.RuinRecreateMoveSelectorConfig; |
50 | 51 | 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; |
51 | 54 | import ai.timefold.solver.core.config.heuristic.selector.move.generic.chained.TailChainSwapMoveSelectorConfig;
|
52 | 55 | import ai.timefold.solver.core.config.heuristic.selector.move.generic.list.ListChangeMoveSelectorConfig;
|
53 | 56 | import ai.timefold.solver.core.config.heuristic.selector.move.generic.list.ListRuinRecreateMoveSelectorConfig;
|
|
56 | 59 | import ai.timefold.solver.core.config.heuristic.selector.move.generic.list.SubListSwapMoveSelectorConfig;
|
57 | 60 | import ai.timefold.solver.core.config.heuristic.selector.move.generic.list.kopt.KOptListMoveSelectorConfig;
|
58 | 61 | import ai.timefold.solver.core.config.heuristic.selector.value.ValueSelectorConfig;
|
| 62 | +import ai.timefold.solver.core.config.heuristic.selector.value.chained.SubChainSelectorConfig; |
59 | 63 | import ai.timefold.solver.core.config.localsearch.LocalSearchPhaseConfig;
|
60 | 64 | import ai.timefold.solver.core.config.localsearch.LocalSearchType;
|
61 | 65 | import ai.timefold.solver.core.config.phase.custom.CustomPhaseConfig;
|
@@ -1418,8 +1422,121 @@ void solveCustomConfigListVariable() {
|
1418 | 1422 | .isEmpty();
|
1419 | 1423 | }
|
1420 | 1424 |
|
| 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 | + |
1421 | 1539 | private static List<MoveSelectorConfig> generateMovesMultiVarModel() {
|
1422 |
| - // Local Search |
1423 | 1540 | var allMoveSelectionConfigList = new ArrayList<MoveSelectorConfig>();
|
1424 | 1541 | // Change - basic
|
1425 | 1542 | allMoveSelectionConfigList.add(new ChangeMoveSelectorConfig());
|
@@ -1462,7 +1579,6 @@ void solveMoveConfigMultiVar(MoveSelectorConfig moveSelectionConfig) {
|
1462 | 1579 | }
|
1463 | 1580 |
|
1464 | 1581 | private static List<MoveSelectorConfig> generateMovesMultiEntityModel() {
|
1465 |
| - // Local Search |
1466 | 1582 | var allMoveSelectionConfigList = new ArrayList<MoveSelectorConfig>();
|
1467 | 1583 | // Change - basic
|
1468 | 1584 | allMoveSelectionConfigList.add(new ChangeMoveSelectorConfig());
|
|
0 commit comments