Exemple #1
0
 def add_player(
     self,
     p,
     price=None,
     season=CURRENT_SEASON,
     gameweek=NEXT_GAMEWEEK,
     check_budget=True,
     check_team=True,
     dbsession=None,
 ):
     """
     Add a player.  Can do it by name or by player_id.
     If no price is specified, CandidatePlayer constructor will use the
     current price as found in DB, but if one is specified, we override
     with that value.
     """
     if isinstance(p, int) or isinstance(p, str) or isinstance(p, Player):
         player = CandidatePlayer(p, season, gameweek, dbsession=dbsession)
     else:  # already a CandidatePlayer (or an equivalent test class)
         player = p
     # set the price if one was specified.
     if price:
         player.purchase_price = price
     # check if constraints are met
     if not self.check_no_duplicate_player(player):
         if self.verbose:
             print("Already have {} in team".format(player.name))
         return False
     if not self.check_num_in_position(player):
         if self.verbose:
             print(
                 "Unable to add player {} - too many {}".format(
                     player.name, player.position
                 )
             )
         return False
     if check_budget and not self.check_cost(player):
         if self.verbose:
             print("Cannot afford player {}".format(player.name))
         return False
     if check_team and not self.check_num_per_team(player):
         if self.verbose:
             print(
                 "Cannot add {} - too many players from {}".format(
                     player.name, player.team
                 )
             )
         return False
     self.players.append(player)
     self.num_position[player.position] += 1
     self.budget -= player.purchase_price
     return True
Exemple #2
0
def make_new_squad_iter(
    gw_range,
    tag,
    budget=1000,
    season=CURRENT_SEASON,
    num_iterations=100,
    update_func_and_args=None,
    verbose=False,
    bench_boost_gw=None,
    triple_captain_gw=None,
    **kwargs,
):
    """
    Make a squad from scratch, i.e. for gameweek 1, or for wildcard, or free hit, by
    selecting high scoring players and then iteratively replacing them with cheaper
    options until we have a valid squad.
    """
    transfer_gw = min(gw_range)  # the gw we're making the new squad
    best_score = 0.0
    best_squad = None

    for iteration in range(num_iterations):
        if verbose:
            print("Choosing new squad: iteration {}".format(iteration))
        if update_func_and_args:
            # call function to update progress bar.
            # this was passed as a tuple (func, increment, pid)
            update_func_and_args[0](update_func_and_args[1],
                                    update_func_and_args[2])
        predicted_points = {}
        t = Squad(budget, season=season)
        # first iteration - fill up from the front
        for pos in positions:
            predicted_points[pos] = get_predicted_points(gameweek=gw_range,
                                                         position=pos,
                                                         tag=tag,
                                                         season=season)
            for pp in predicted_points[pos]:
                t.add_player(pp[0], gameweek=transfer_gw)
                if t.num_position[pos] == TOTAL_PER_POSITION[pos]:
                    break

        # presumably we didn't get a complete squad now
        excluded_player_ids = []
        while not t.is_complete():
            # randomly swap out a player and replace with a cheaper one in the
            # same position
            player_to_remove = t.players[random.randint(0, len(t.players) - 1)]
            remove_cost = player_to_remove.purchase_price
            t.remove_player(player_to_remove.player_id, gameweek=transfer_gw)
            excluded_player_ids.append(player_to_remove.player_id)
            for pp in predicted_points[player_to_remove.position]:
                if (pp[0] not in excluded_player_ids or random.random() <
                        0.3):  # some chance to put player back
                    cp = CandidatePlayer(pp[0],
                                         gameweek=transfer_gw,
                                         season=season)
                    if cp.purchase_price >= remove_cost:
                        continue
                    else:
                        t.add_player(pp[0], gameweek=transfer_gw)
            # now try again to fill up the rest of the squad
            for pos in positions:
                num_missing = TOTAL_PER_POSITION[pos] - t.num_position[pos]
                if num_missing == 0:
                    continue
                for pp in predicted_points[pos]:
                    if pp[0] in excluded_player_ids:
                        continue
                    t.add_player(pp[0], gameweek=transfer_gw)
                    if t.num_position[pos] == TOTAL_PER_POSITION[pos]:
                        break
        # we have a complete squad
        score = 0.0
        for gw in gw_range:
            if gw == bench_boost_gw:
                score += t.get_expected_points(
                    gw, tag, bench_boost=True) * get_discount_factor(
                        gw_range[0], gw)
            elif gw == triple_captain_gw:
                score += t.get_expected_points(
                    gw, tag, triple_captain=True) * get_discount_factor(
                        gw_range[0], gw)
            else:
                score += t.get_expected_points(gw, tag) * get_discount_factor(
                    gw_range[0], gw)
        if score > best_score:
            best_score = score
            best_squad = t

    if verbose:
        print("====================================\n")
        print(best_squad)
        print(best_score)
    return best_squad