OptaPlanner EOL notice - Timefold offers support
January 10th, 2024

Timefold Solver Community Edition 1.6.0

New year, new release, new goodness!

Featured Update - Pinning on list variables, enhancing our support for real-time planning:

  • With a new @PlanningPinToIndex annotation, you can tell the solver that a certain portion of the list variable is pinned and shouldn't be moved.
  • For example, for a list of customers that a vehicle will visit, this allows you to model situations where certain visits have either already happened, or where the vehicle is already too far into the trip that it would not be practical for it to turn back.
  • Previously, pinning was only available for the chained variable. With this, we are ramping up our efforts to bring list variable, which is easier to both understand and implement, on par with the chain variable in terms of features. Stay tuned for more on this front!

Other Enhancements:

  • Solver termination can now be overridden without creating a new instance of Solver or SolverManager, look for the SolverConfigOverride class.
  • The usual assortment of bugfixes and performance improvements.
  • Improvements all over the documentation and quickstarts.
  • Dependency upgrades.


🚀 Features

  • Pinning support for list variable (#491), closes #491
  • Syntactic sugar for ScoreAnalysis (#546), closes #546
  • Overriding Solver termination configuration (#542), closes #515 #542
  • PlannerBenchmarkFactory.createFromSolverConfig() (#479), closes #479

🐛 Fixes

  • Avoid exception when analysing uninitialized solution (#536), closes #536
  • Fail fast when @DeepPlanningClone on a record
  • Make MatchAnalysis implement Comparable to fix score corruption analysis (#527), closes #527
  • Updating the School Timetabling quickstarts documentation (#494), closes #98 #494
  • Non-existent methods referenced for score explanation
  • Filter trivial 2-opt moves and make KOptListMove public (#485), closes #480 #485
  • Do not set shadow variables to null when calculating from scratch in TRACED_FULL_ASSERT (#484), closes #478 #484

🔄️ Changes

  • Reduce allocations in CS

📝 Documentation

  • Add Quickstart code examples for Kotlin (#541), closes #541
  • Rename variable names for collection types (#499), closes #499
  • Use tabs where possible to have better distinction between Maven and Gradle
  • Maintenance scheduling class diagram rename tagSet to reality
  • Add chapter on CS performance


We'd like to thank the following people for their contributions:

  • Christopher Chianelli
  • Frederico Gonçalves (@zepfred)
  • Geoffrey De Smet
  • GitHub
  • Lukáš Petrovický (@triceo)
  • M.Thimm
  • Peter Laggner
  • Pieter De Schepper
  • Radovan Synek
  • dependabot[bot] (@dependabot[bot])

Timefold Solver Community Edition is an open source project, and you are more than welcome to contribute as well! For more, see Contributing.

Should your business need to scale to truly massive data sets or require enterprise-grade support, check out Timefold Solver Enterprise Edition.

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 : 1.6.0 dependency in your pom.xml to get started.

You can also import the Timefold Solver Bom (ai.timefold.solver : timefold-solver-bom : 1.6.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.

Back to overview