I’m just okay at picking basketball brackets. I usually finish somewhere in the upper third of the pack, IIRC.
However, it’s interesting to enter a bracket and watch the results come in (I almost never watch the games), so I usually make a bracket.
This year, I decided to use Coder’s Bracket to create my bracket.
If you haven’t already seen Coder’s Bracket, you should take a look. Basically, you algorithmically generate your bracket using JavaScript. However, setting that up manually is a lot of work. Fortunately, Coder’s Bracket has already done that for you. You provide a function taking three object parameters (game
, team1
, team2
) that will call team1.winsGame()
or team2.winsGame()
depending on what you determine. You start with a simple seed-rules algorithm and work from there.
My algorithm runs basically like this:
- If it’s round 1 and the seed is greater than 5, it wins.
- If it’s round 2 and the seed is greater than 2, it wins.
- Otherwise, compute my extremely not scientific score for each team and the higher score wins.
My scoring algorithm takes into account strength of schedule (RPI), Field Goal %, Free Throw %, 3’s %, and Missed 3’s. I weight the values to make my bracket interesting (probably at the cost of correctness…).
There are probably a million and a half (exactly) problems with this algorithm, but it was fun to create.
You can see my bracket on Coder’s Bracket’s website.
I’ve included my algorithm below.
function(game, team1, team2){ // Seeds 5 and better don't lose in the first round if (game.round == 5) { if (team1.seed >= 5 || team2.seed >= 5) { if (team1.seed > team2.seed) { team2.winsGame(); } else { team1.winsGame(); } } } // Seeds 2 and better don't lose in the second round if (game.round == 4) { if (team1.seed >= 3 || team2.seed >= 3) { if (team1.seed > team2.seed) { team2.winsGame(); } else { team1.winsGame(); } } } // Everyone else goes through my TOTALLY SCIENTIFIC scoring algorithm if (calcScore(team1) > calcScore(team2)) { team1.winsGame(); } else { team2.winsGame(); } // Scoring algorithm // Mostly objective, but I tweaked the weights to make my bracket interesting // I'm using the RPI, apparently a ranking of schedule difficulty to make win percentage be somewhat fair. // It's divided by two to lessen it's impact // // The numbers on the far side are the weights for each item function calcScore(team) { var myScore = 0; myScore += team.rpi/2 * team.win_pct * 10; // Winning percentage myScore += team.rpi/2 * team.field_goal_pct * 7; // Field Goal percentage myScore += team.rpi/2 * team.free_throw_pct * 4; // Free Throw percentage myScore += team.rpi/2 * team.three_point_pct * 5; // 3's percentage // Penalty for missing 3's. About 10 per game on average, so I divided by 20 to lessen the impact. myScore -= team.rpi/2 * (team.threes_attempted - team.threes_made)/20 * 3; return myScore; } }