There is an in-between option, at least for some use cases: Over time iteratively create a more complete set of constraints/heuristics, use them to generate one or more candidate solutions, and then manually tweak them.
Each round of iteration, look at which missing constraints caused the most manual tweaks, and improve from there.
Each round of iteration, look at which missing constraints caused the most manual tweaks, and improve from there.