PredictionFantasy
← All articles
2 min readPrediction Fantasy

How the optimizer actually builds 300 lineups

Most tools generate one good lineup and shuffle it. Ours solves each lineup to true optimality against your constraints. Here's the difference, and why it matters for a large portfolio.


There are two ways to produce 300 DFS lineups, and the gap between them is the whole product.

The cheap way is to build one optimal lineup, then swap players around at random until you have 300 that look different. It's fast, and it's what a lot of tools do. The problem is that lineup 250 isn't a considered lineup — it's lineup 1 with noise applied. You've paid for 300 entries and received one idea.

The expensive way is to solve the problem 300 times, each time forbidding the lineups you already have. That's what this optimizer does.

What "solved" means here

Every build is a constrained optimization problem. Nine roster spots, a $50,000 salary cap, position requirements, and whatever stacking and exposure rules you've set. The solver finds the highest-projecting lineup that satisfies all of it — not a good guess, the actual maximum.

Then it adds one rule — the next lineup must differ from this one — and solves again.

That's why lineup 300 is still a real lineup. It's the best remaining option once the 299 above it are off the table.

The cost of doing it properly

Being honest about the tradeoff: this is slower. On a full NFL main slate, 300 lineups takes around six minutes, because each successive solve has more constraints to satisfy than the last.

You can cut that substantially by raising the randomization setting. At 0% the solver is splitting hairs between near-identical lineups, and proving which one wins is the expensive part. At 5–10% it stops agonizing over ties, runs roughly twice as fast, and diversifies your portfolio — which is usually what you wanted for a 300-entry set anyway.

Where your read comes in

The projections are a starting point, not a verdict. Every player has an editable FPTS field, and the optimizer uses your number, not ours.

That matters more than it sounds. If you think a receiver's projection is two points light because of a matchup the model doesn't see, you change it, and every one of your 300 lineups reflects that view. Combined with minimum and maximum exposure per player, you're steering the portfolio rather than accepting it.

What it won't do

It won't tell you which lineup wins. Nothing can. What it will do is guarantee that given your projections and your rules, you are not leaving points on the table — and that you own 300 distinct opinions instead of one repeated 300 times.

Want the tools behind the writing?

The optimizer, every slate cheatsheet, and the private Discord come with Pro.

See pricing