For the sake of simplicity and not attempting to implement an overly complicated solution right off, I still think the most important element to target is minimization of officers (regardless of quality) getting promoted into in ranks with nothing to do. This is the main situation caused by fixed ratios that I think we would all like to minimize.
So if we only promote someone directly into another empty position, then it will minimize idleness at higher ranks, even if it results in the 'wrong man for the job' getting the seat. I'd take that inefficiency, and more than happy to RP it away mentally, for having the most generally experienced officers adding some kind of value (even in the case of a combat vet being assigned to an Admiral position overseeing Logistics fleet), at least they won't be jobless. Added bonus if they can learn new skills they're using in the new seat, even when they start with 0.
So I propose simply:
- Promote only when a seat opens up.
- Prioritize on matching traits from next lowest rank
- If no match, then just pick the officer with highest promotion score in that rank.
- That's it; no shuffling or reassigning, or worrying about tours of duty, just FIFO straight line up the chain with priority given to fit if available.
edit: LIFO -> FIFO