This is precisely what optaplanner was designed to do. Note the optaplanner has been forked by its original author and main contributor when they left RedHat/IBM. The fork is called "TimeFold", most development happens there now.
> The fork is called "TimeFold", most development happens there now.
Thanks. Last time I used optaplanner was several years ago on an aerospace project - if I need a constraint solver again I'll definitely look at TimeFold.