def run(max_flex, maxed_over, remove, chosen_dict, year, week): solver = pywraplp.Solver('FD', pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING) all_players = [] if year == CUR_YEAR and week == CUR_WEEK: with open('data/DKSalariesCurrent.csv', 'rb') as csvfile: csvdata = csv.reader(csvfile, skipinitialspace=True) for idx, row in enumerate(csvdata): if idx > 0: all_players.append( Player(row[0], generate_pid(row[1], row[0]), row[1], row[2])) else: for i, row in df[df['Year'] == year][df['Week'] == week].iterrows(): if not np.isnan(row['Salary']) and row['Salary'] > 0: all_players.append( Player(row['Pos'], row['PID'], row['Name'], row['Salary'])) # give each a ranking all_players = sorted(all_players, key=lambda x: x.cost, reverse=True) for idx, x in enumerate(all_players): x.cost_ranking = idx + 1 with open('data/%s-Week%s.csv' % (year, week), 'rb') as csvfile: csvdata = csv.DictReader(csvfile) worked = 0 for row in csvdata: player = filter(lambda x: x.pid in row['playername'], all_players) try: player[0].proj = float(row['points']) player[0].marked = 'Y' except: pass #check_missing_players(all_players, args.sp, args.mp) # remove previously optimize all_players = filter(lambda x: x.pid not in remove, all_players) variables, solution = run_solver( solver, all_players, max_flex, chosen_dict) if solution == solver.OPTIMAL: roster = Roster() for i, player in enumerate(all_players): if variables[i].solution_value() == 1: roster.add_player(player) # print "Optimal roster for: %s" % maxed_over # print roster return roster else: raise Exception('No solution error')
def run(max_flex, maxed_over): solver = pywraplp.Solver('FD', pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING) all_players = [] with open('data/dk-salaries-week-1.csv', 'rb') as csvfile: csvdata = csv.reader(csvfile, skipinitialspace=True) for idx, row in enumerate(csvdata): if idx > 0: all_players.append(Player(row[0], row[1], row[2])) # give each a ranking all_players = sorted(all_players, key=lambda x: x.cost, reverse=True) for idx, x in enumerate(all_players): x.cost_ranking = idx + 1 with open('data/ffa.csv', 'rb') as csvfile: csvdata = csv.DictReader(csvfile) for row in csvdata: player = filter(lambda x: row['playername'] in x.name, all_players) try: player[0].proj = int(int(row['points'].split('.')[0]) / 16) player[0].marked = 'Y' except: pass check_missing_players(all_players, 100) variables, solution = run_solver(solver, all_players, max_flex) if solution == solver.OPTIMAL: roster = Roster() for i, player in enumerate(all_players): if variables[i].solution_value() == 1: roster.add_player(player) print "Optimal roster for: %s" % maxed_over print roster else: raise Exception('No solution error')
def run_solver(all_players, depth): solver = pywraplp.Solver('FD', pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING) ''' Setup Binary Player variables ''' variables = [] for player in all_players: variables.append(solver.IntVar(0, 1, player.code)) ''' Setup Maximization over player point projections ''' objective = solver.Objective() objective.SetMaximization() for i, player in enumerate(all_players): objective.SetCoefficient(variables[i], player.proj) ''' Add Salary Cap Constraint ''' salary_cap = solver.Constraint(SALARY_CAP - 1000, SALARY_CAP) for i, player in enumerate(all_players): salary_cap.SetCoefficient(variables[i], player.cost) ''' Add Player Position constraints including flex position ''' flex_rb = solver.IntVar(0, 1, 'Flex_RB') flex_wr = solver.IntVar(0, 1, 'Flex_WR') flex_te = solver.IntVar(0, 1, 'Flex_TE') solver.Add(flex_rb + flex_wr + flex_te == 1) for position, limit in POSITION_LIMITS_FLEX: ids, players_by_pos = zip(*filter(lambda (x, _): x.pos in position, zip(all_players, variables))) if position == 'WR': solver.Add(solver.Sum(players_by_pos) == limit + flex_wr) elif position == 'RB': solver.Add(solver.Sum(players_by_pos) == limit + flex_rb) elif position == 'TE': solver.Add(solver.Sum(players_by_pos) == limit + flex_te) else: solver.Add(solver.Sum(players_by_pos) == limit) ''' Add min number of different teams players must be drafted from constraint (draftkings == 2) ''' team_names = set([o.team for o in all_players]) teams = [] for team in team_names: teams.append(solver.IntVar(0, 1, team)) solver.Add(solver.Sum(teams) >= 2) for idx, team in enumerate(team_names): ids, players_by_team = zip(*filter(lambda (x, _): x.team in team, zip(all_players, variables))) solver.Add(teams[idx] <= solver.Sum(players_by_team)) ''' Add Defence cant play against any offense's player team constraint ''' o_players = filter(lambda x: x.pos in ['QB', 'WR', 'RB', 'TE'], all_players) opps_team_names = set([o.opps_team for o in o_players]) teams_obj = filter(lambda x: x.pos == 'DST', all_players) teams = set([o.team for o in teams_obj]) for opps_team in team_names: if opps_team in teams: ids, players_by_opps_team = zip(*filter( lambda (x, _): x.pos in ['QB', 'WR', 'RB', 'TE'] and x. opps_team in opps_team, zip(all_players, variables))) idxs, defense = zip( *filter(lambda (x, _): x.pos == 'DST' and x.team in opps_team, zip(all_players, variables))) for player in players_by_opps_team: solver.Add(player <= 1 - defense[0]) ''' Add QB stacking (at least 1 wr on same team as QB) constraint ''' offense_team_names = set([o.team for o in o_players]) for o_team in offense_team_names: ids, players_by_team = zip( *filter(lambda (x, _): x.pos in ['WR'] and x.team == o_team, zip(all_players, variables))) idxs, qb = zip( *filter(lambda (x, _): x.pos == 'QB' and x.team == o_team, zip(all_players, variables))) solver.Add(solver.Sum(players_by_team) >= solver.Sum(qb)) ''' Add Max of 1 qb wr te or rb per team constraint, NOT TO BE USED WITH QB STACKING ''' # for team in list(team_names): # ids, players_by_team = zip(*filter(lambda (x,_): x.team in team and x.pos in ['WR','TE','RB','QB'], zip(all_players, variables))) # solver.Add(solver.Sum(players_by_team)<=1) ''' Add Max of 2 qb wr te or rb per game constraint, spread risk ''' #for team in list(team_names): # team_players = filter(lambda x: x.team in team, all_players) # ids, players_by_game = zip(*filter(lambda (x,_): x.team in team or x.team in team_players[0].opps_team and x.pos in ['WR','TE','RB','QB'], zip(all_players, variables))) # solver.Add(solver.Sum(players_by_game)<=2) ''' Add remove previous solutions constraint and loop to generate X rosters ''' rosters = [] for x in xrange(depth): if rosters: ids, players_from_roster = zip( *filter(lambda (x, _): x in rosters[-1].sorted_players(), zip(all_players, variables))) ids, players_not_from_roster = zip( *filter(lambda (x, _): x not in rosters[-1].sorted_players(), zip(all_players, variables))) solver.Add( solver.Sum(players_not_from_roster) + solver.Sum(1 - x for x in players_from_roster) >= 9) solution = solver.Solve() if solution == solver.OPTIMAL: roster = Roster() for i, player in enumerate(all_players): if variables[i].solution_value() == 1: roster.add_player(player) rosters.append(roster) print "Optimal roster: %s" % x print roster else: raise Exception('No solution error') return rosters
def run_solver(all_players, depth): solver = pywraplp.Solver("FD", pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING) """ Setup Binary Player variables """ variables = [] for player in all_players: variables.append(solver.IntVar(0, 1, player.code)) """ Setup Maximization over player point projections """ objective = solver.Objective() objective.SetMaximization() for i, player in enumerate(all_players): objective.SetCoefficient(variables[i], player.proj) """ Add Salary Cap Constraint """ salary_cap = solver.Constraint(SALARY_CAP - 1000, SALARY_CAP) for i, player in enumerate(all_players): salary_cap.SetCoefficient(variables[i], player.cost) """ Add Player Position constraints including flex position """ flex_rb = solver.IntVar(0, 1, "Flex_RB") flex_wr = solver.IntVar(0, 1, "Flex_WR") flex_te = solver.IntVar(0, 1, "Flex_TE") solver.Add(flex_rb + flex_wr + flex_te == 1) for position, limit in POSITION_LIMITS_FLEX: ids, players_by_pos = zip(*filter(lambda (x, _): x.pos in position, zip(all_players, variables))) if position == "WR": solver.Add(solver.Sum(players_by_pos) == limit + flex_wr) elif position == "RB": solver.Add(solver.Sum(players_by_pos) == limit + flex_rb) elif position == "TE": solver.Add(solver.Sum(players_by_pos) == limit + flex_te) else: solver.Add(solver.Sum(players_by_pos) == limit) """ Add min number of different teams players must be drafted from constraint (draftkings == 2) """ team_names = set([o.team for o in all_players]) teams = [] for team in team_names: teams.append(solver.IntVar(0, 1, team)) solver.Add(solver.Sum(teams) >= 2) for idx, team in enumerate(team_names): ids, players_by_team = zip(*filter(lambda (x, _): x.team in team, zip(all_players, variables))) solver.Add(teams[idx] <= solver.Sum(players_by_team)) """ Add Defence cant play against any offense's player team constraint """ o_players = filter(lambda x: x.pos in ["QB", "WR", "RB", "TE"], all_players) # opps_team_names= set([o.opps_team for o in o_players]) # teams_obj = filter(lambda x: x.pos == 'DST' , all_players) # teams = set([o.team for o in teams_obj]) # for opps_team in team_names: # if opps_team in teams : # ids, players_by_opps_team = zip(*filter(lambda (x,_): x.pos in ['QB','WR','RB','TE'] and x.opps_team in opps_team, zip(all_players, variables))) # idxs, defense = zip(*filter(lambda (x,_): x.pos == 'DST' and x.team in opps_team, zip(all_players, variables))) # solver.Add(solver.Sum(1-x for x in players_by_opps_team)+solver.Sum(1-x for x in defense)>=1) """ Add QB stacking (at least 1 wr or te on same team as QB) constraint """ offense_team_names = set([o.team for o in o_players]) for o_team in offense_team_names: ids, players_by_team = zip( *filter(lambda (x, _): x.pos in ["WR", "TE"] and x.team == o_team, zip(all_players, variables)) ) idxs, qb = zip(*filter(lambda (x, _): x.pos == "QB" and x.team == o_team, zip(all_players, variables))) solver.Add(solver.Sum(players_by_team) >= solver.Sum(qb)) """ Add Max of 1 qb wr te or rb per team constraint, NOT TO BE USED WITH QB STACKING """ # for team in list(team_names): # ids, players_by_team = zip(*filter(lambda (x,_): x.team in team and x.pos in ['WR','TE','RB','QB'], zip(all_players, variables))) # solver.Add(solver.Sum(players_by_team)<=1) """ Add Max of 2 qb wr te or rb per game constraint """ for team in list(team_names)[: len(team_names) / 2]: team_players = filter(lambda x: x.team in team, all_players) ids, players_by_game = zip( *filter( lambda (x, _): x.team in team or x.team in team_players[0].opps_team and x.pos in ["WR", "TE", "RB", "QB"], zip(all_players, variables), ) ) solver.Add(solver.Sum(players_by_game) <= 2) """ Add remove previous solutions constraint and loop to generate X rosters """ rosters = [] for x in xrange(depth): if rosters: ids, players_from_roster = zip( *filter(lambda (x, _): x in rosters[-1].sorted_players(), zip(all_players, variables)) ) ids, players_not_from_roster = zip( *filter(lambda (x, _): x not in rosters[-1].sorted_players(), zip(all_players, variables)) ) solver.Add(solver.Sum(players_not_from_roster) + solver.Sum(1 - x for x in players_from_roster) >= 1) solution = solver.Solve() if solution == solver.OPTIMAL: roster = Roster() for i, player in enumerate(all_players): if variables[i].solution_value() == 1: roster.add_player(player) rosters.append(roster) print "Optimal roster iterations: %s" % x print roster else: raise Exception("No solution error") return rosters