NLopt seems interesting but designed for mathematical optimization with gradients. Probably not a good fit?
Butterick's csp seems like a straightforward way to work up the "generate possible solutions" or "generate plausibly optimal solutions" idea from an encoding of the relevant rules. The key will be performance: knowing that the state space is humongous (see CS StackExchange post above), we'll probably need to become clever "constraint engineers" to get good performance. That said, this seems like a good direction to try. It's usefulness likely depends on good data visualizations, though!