I had a very similar idea when planning my wedding in 2015, and I wrote https://github.com/shields/saseat. It worked out great! That code has now been used to plan at least three weddings.
Simulated annealing, or even simpler greedy versions, are a great pragmatic solution for fuzzy problems like this, where the optimal solution is very hard to find (and/or theres no clear definition of optimality), and where any somewhat optimized solution is practically “good enough”. Especially since the objective function is typically made up by the human and minor variations have a bigger effect in the result than a poor implementation of the annealing. Even if it gets caught in a local maximum - the result is still leagues better than a human doing it.
I’ve used a similar approach to: create teams for an incubator; set a team schedule given several constraints for each member (ex. “Alice wants to work 5 - 10 hours, prefer Tuesdays, but can do Wednesdays”); and match alumni in a pool of 600 for monthly 1-on-1s.