def run_solver(solver, all_players, args): ''' Set objective and constraints, then optimize ''' variables = [] for player in all_players: if player.lock and not player.multi_position: variables.append(solver.IntVar(1, 1, player.solver_id)) else: variables.append(solver.IntVar(0, 1, player.solver_id)) objective = solver.Objective() objective.SetMaximization() # optimize on projected points for i, player in enumerate(all_players): objective.SetCoefficient(variables[i], player.proj) # set multi-player constraint multi_caps = {} for i, p in enumerate(all_players): if not p.multi_position: continue if p.name not in multi_caps: if p.lock: multi_caps[p.name] = solver.Constraint(1, 1) else: multi_caps[p.name] = solver.Constraint(0, 1) multi_caps[p.name].SetCoefficient(variables[i], 1) # set salary cap constraint salary_cap = solver.Constraint(0, cons.SALARY_CAP) for i, player in enumerate(all_players): salary_cap.SetCoefficient(variables[i], player.cost) # set roster size constraint size_cap = solver.Constraint(cons.ROSTER_SIZE[args.l], cons.ROSTER_SIZE[args.l]) for variable in variables: size_cap.SetCoefficient(variable, 1) # set position limit constraint for position, min_limit, max_limit in cons.POSITIONS[args.l]: position_cap = solver.Constraint(min_limit, max_limit) for i, player in enumerate(all_players): if position == player.pos: position_cap.SetCoefficient(variables[i], 1) # set G / F NBA position limits if args.l == 'NBA': for general_position, min_limit, max_limit in \ cons.NBA_GENERAL_POSITIONS: position_cap = solver.Constraint(min_limit, max_limit) for i, player in enumerate(all_players): if general_position == player.nba_general_position: position_cap.SetCoefficient(variables[i], 1) # max out at one player per team (allow QB combos) team_limits = set([(p.team, 0, 1) for p in all_players]) if args.limit != 'n': for team, min_limit, max_limit in team_limits: team_cap = solver.Constraint(min_limit, max_limit) for i, player in enumerate(all_players): if team.upper() == player.team.upper() and \ player.pos != 'QB': team_cap.SetCoefficient(variables[i], 1) # force QB / WR or QB / TE combo on specified team if args.duo != 'n': all_teams = set(p.team for p in all_players) if args.duo.upper() not in all_teams: raise dke.InvalidNFLTeamException( 'You need to pass in a valid NFL team ' + 'abbreviation to use this option. ' + 'See valid team abbreviations here: ' + str(all_teams)) for pos, min_limit, max_limit in cons.DUO_TYPE[args.dtype.lower()]: position_cap = solver.Constraint(min_limit, max_limit) for i, player in enumerate(all_players): if pos == player.pos and \ player.team.upper() == args.duo.upper(): position_cap.SetCoefficient(variables[i], 1) return variables, solver.Solve()
def run_solver(solver, all_players, max_flex, args): ''' Set objective and constraints, then optimize ''' variables = [] for player in all_players: if player.lock: variables.append(solver.IntVar(1, 1, player.name)) else: variables.append(solver.IntVar(0, 1, player.name)) objective = solver.Objective() objective.SetMaximization() # optimize on projected points for i, player in enumerate(all_players): objective.SetCoefficient(variables[i], player.proj) # set salary cap constraint salary_cap = solver.Constraint(0, cons.SALARY_CAP) for i, player in enumerate(all_players): salary_cap.SetCoefficient(variables[i], player.cost) # set roster size constraint size_cap = solver.Constraint(cons.ROSTER_SIZE[args.l], cons.ROSTER_SIZE[args.l]) for variable in variables: size_cap.SetCoefficient(variable, 1) # set position limit constraint for position, min_limit, max_limit in cons.POSITIONS[args.l]: position_cap = solver.Constraint(min_limit, max_limit) for i, player in enumerate(all_players): if position == player.pos: position_cap.SetCoefficient(variables[i], 1) # max out at one player per team (allow QB combos) if args.limit != 'n': for team, min_limit, max_limit in cons.COMBO_TEAM_LIMITS_NFL: team_cap = solver.Constraint(min_limit, max_limit) for i, player in enumerate(all_players): if team.upper() == player.team.upper() and \ player.pos != 'QB': team_cap.SetCoefficient(variables[i], 1) # force QB / WR or QB / TE combo on specified team if args.duo != 'n': if args.duo.upper() not in cons.ALL_NFL_TEAMS: raise dke.InvalidNFLTeamException( 'You need to pass in a valid NFL team ' + 'abbreviation to use this option. ' + 'See valid team abbreviations here: ' + str(cons.ALL_NFL_TEAMS)) for pos, min_limit, max_limit in cons.DUO_TYPE[args.dtype.lower()]: position_cap = solver.Constraint(min_limit, max_limit) for i, player in enumerate(all_players): if pos == player.pos and \ player.team.upper() == args.duo.upper(): position_cap.SetCoefficient(variables[i], 1) return variables, solver.Solve()