Timefold Solver 2.7.0
We've really been cooking this time! With so much goodness available in this release, an upgrade may just be worth the few seconds it will take.
- Coarse-grained moves in Neighborhoods: With the recent improvements to Neighborhoods, we have been able to introduce many advanced moves, such as pillar moves or sublist moves. The API continues to evolve towards feature parity with move selectors!
- Significant performance improvements for shadow variables: Heavy users of shadow variables, especially together with list variables and especially with our Enterprise Edition, are likely to experience an order of magnitude improvement in move speed of their solvers. Find out how to access these improvements.
- Environment mode now configurable per-phase: if you ever needed to run your local search with
FULL_ASSERTbut your Construction Heuristic was slowing you down, you can now enable the strong assertion mode for any phase individually - so your CH stays fast, and your assertions only run with LS. - Improved performance overall: we now have more efficient undo moves, and generally use less memory.
Changelog
🚀 Features
- neighborhoods: introduce coarse-grained generic moves (#2610)
- add environment mode per phase (#2595)
- (service) store execution profile in metadata (#2631)
🐛 Fixes
- update all unassigned values when multiple were unassigned (#2689)
- revapi check should include all reference types (#2670)
- define timefold-maven-plugin version in parent pom.xml
- use the same tag keyset everywhere (#2650)
- mark ModelConvertor parameters and returns as non-null (#2507) (#2519)
- prevent overriding the solver version by models
- improved handling of logging for platform authentication (#2628)
- false positive warnings for new properties (#2617)
🔄️ Changes
- bavet: speed up ifExists+join preload (#2662)
- shadows: replace the declarative change queue with an int heap (#2660)
- shadows: decrease allocations in shadow variable processing (#2642)
- shadows: improve move evaluation speed by ignoring calculating the score for inconsistent solutions (#2630)
- recording fewer, cheaper move undo steps (#2649)
- standardize handling of BigDecimal in scores (#2646)
🧰 Tasks
- rename Example maturity level to Template (#2661)
- introduce revapi check for solver-service (#2664)
📝 Documentation
- improve enterprise license docs (#2654)
- link Vehicle Routing Problem on first mention in VRP quickstart (#2645)
- clarify single use of PlanningListVariable per solution. (#2632)
- demo data add note on decoupling and return type (#2627)
- document updating multiple fields with custom shadow variables (#2619)
Contributors
We'd like to thank the following people for their contributions:
- Christopher Chianelli (@Christopher-Chianelli)
- Diogo Ferreira (@diogodanielsoaresferreira)
- Frederico Gonçalves (@zepfred)
- Lukas Downes (@LDWNS)
- Lars Beckmann (@larsbeck)
- Lukáš Petrovický (@triceo)
- Maciej Swiderski (@mswiderski)
- Marek Winkler (@winklerm)
- Radovan Synek (@rsynek)
- Tom Cools (@TomCools)
- Vikas Prasad (@vikas-prasad-cx)
- @fodzal
- Lee Carlon (@lee-carlon)
Timefold Solver Community Edition is an open source project, and you are more than welcome to contribute as well! For more, see Contributing.
Timefold also offers commercial editions of the solver, which include additional features such as explainability, the ability to scale out to the biggest datasets, and enterprise-grade support. Find out more about the different editions.
How to use Timefold Solver
To see Timefold Solver in action, check out the quickstarts.
With Maven or Gradle, add the ai.timefold.solver : timefold-solver-core : 2.7.0 dependency in your pom.xml to get started.
You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 2.7.0)
to avoid duplicating version numbers when adding other Timefold Solver dependencies later on.
Additional notes
The changelog and the list of contributors above are automatically generated. It excludes contributions to certain areas of the repository, such as CI and build automation. This is done for the sake of brevity and to make the user-facing changes stand out more.