If your computer could test out a million combinations per second, it would take you a little more than 720296800 million centuries to look at all possible combinations.
This makes for an interesting search problem. To solve this problem (by which I mean a good solution, as optimal solutions are hard to come by in NP-complete and NP-hard problems), you need a search algorithm, an objective function, and projections. Naturally, the whole exercise is only as good as the projections.I'm starting with simulated annealing as the algorithm. It is simpler to deal with than some other metaheuristics (although I prefer Ant Colony Optimization).
For projections, I'll just use Dodds' most recent. Once the program is done, adjusting the projections is really straightforward, if tedious.
The objective function quantifies the "goodness" of any potential solution. For a total points format, you simply want to maximize points. For a survivor format, you want to minimize the chance of being eliminated, which is probably done by maximizing the points scored in the worst week. This means the projections need to be prorated across weeks, and I am thinking that strength of schedule should be taken into account.
For example, I have a player projected to score, say, 218 points over the season. I have a strength of schedule for his team and his position. I normalize the SoS numbers so that each week is a percentage of the total points, and I can compute a score for each player for each week by dividing 218 by 17 weeks, then multiplying that number by the SoS-derived percentages (which total 100%).
Now, I want to generate solutions (rosters) such that the positions meet the rules, and the cost does not exceed 250. Given that roster, I can compute the number of points for each week, assuming the top N scorers at each position, based on the scoring rules. I really want to maximize the minimum week, but I also want to score as many points as I can over most weeks. I also should consider that some bye weeks will have a lower average score than others and non-bye weeks, so I really should generate some sort of "competitiveness" value for each week, and measure the projected weekly scores against this. But I haven't yet done that.
I also want to account for depth. If you simply take the top scoring player(s) each week, then sometimes the backup will never register. For example, Peyton Mannig will likely be the projected keeper score at QB for all weeks other than his bye week. That means the 3rd QB would never be selected in this process, and therefore the program will probably pick someone like Grossman. To account for this, I also want to include the total weekly score of the entire roster, weighted lower than the scores of the projected starting roster. This will, I hope, give me a stronger chance to survive in the face of injuries and bad games for the studs.
A sample result, using projections from 8/10 (IIRC) is this:
ROSTER
player 44 Jake Delhomme QB Carolina Panthers 15 269
player 55 Brad Johnson QB Minnesota Vikings 10 216
player 58 Philip Rivers QB San Diego Chargers 10 240
player 130 Kevin Faulk RB New England Patriots 3 103
player 106 Reggie Bush RB New Orleans Saints 22 224
player 96 Kevin Jones RB Detriot Lions 38 239
player 144 Duce Staley RB Pittsburgh Steelers 2 85
player 137 Cedric Houston RB New York Jets 2 119
player 172 Hines Ward WR Pittsburgh Steelers 36 242
player 171 Donald Driver WR Green Bay Packers 36 246
player 192 Terry Glenn WR Dallas Cowboys 13 188
player 183 TJ Houshmanzadeh WR Cincinnati Bengals 23 217
player 240 Doug Gabriel WR Oakland Raiders 1 127
player 225 Travis Taylor WR Minnesota Vikings 2 121
player 223 Chad Jackson WR New England Patriots 2 107
player 303 Daniel Graham TE New England Patriots 1 56
player 264 Todd Heap TE Baltimore Ravens 22 186
player 314 Jason Elam PK Denver Broncos 3 124
player 311 Adam Vinatieri PK New England Patriots 4 138
player 16 Miami Dolphins DE Miami Dolphins 3 115
player 21 New York Jets DE New York Jets 2 105
=== cost 250 score 3467
week 1 score: 113.542218006487 209.935146098421
week 2 score: 125.759584560618 218.723049315972
week 3 score: 116.055384735941 175.828208642926
week 4 score: 122.631580612989 190.044605801122
week 5 score: 117.116793518391 197.057008849534
week 6 score: 118.298466239062 156.791264292928
week 7 score: 113.527399623348 202.396996955737
week 8 score: 113.066615360575 202.811870744064
week 9 score: 117.844960625356 187.956291730224
week 10 score: 122.956959539292 215.704284368622
week 11 score: 128.954883792368 229.079297598075
week 12 score: 114.593992812954 211.289220880133
week 13 score: 123.447349995104 216.661571519475
week 14 score: 127.271928807473 221.549957178136
week 15 score: 120.158917963307 216.82558038784
week 16 score: 118.001591786891 208.139462947631
(The player data includes the cost and the projected points scored for the season as the last two values. The weekly data is the projected score for the top players (1 QB, 2 RB, 3 WR, etc.) and the projected score for the entire roster.)Since simulated annealing uses randomness to arrive at a solution, the rosters may well have an eyebrow-raising component. Ignoring that for now, it looks to me like I should implement the competitiveness value I mentioned above, so each week could be judged in the context of bye weeks. It also looks like I need to use a gradient to emphasize later weeks more, given that the teams surviving to those weeks will be stronger, and thus my roster will need to be correspondingly stronger then to survive the cut. I am also thinking of watering down the effect of SoS, perhaps by making only 50% of a player's weekly score based on SoS and the other 50% being 1/16 of the total projected points for the season.
I would be happy to post the source code for this, but it contains Clayton's Ultimate SoS numbers and David's projections, both from the subscriber area, so I would need to get FBGs permission first. Meanwhile, it is just another exercise in entertainment, since I don't know how to account for luck in my objective function! It should result in a better roster than I would be able to select by any other means, but based on my performance in the contest 2 years ago, that isn't saying much.