Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def select_team(expected_scores, prices, positions, clubs):
- num_players = len(expected_scores)
- model = pulp.LpProblem("Constrained value maximisation", pulp.LpMaximize)
- decisions = [
- pulp.LpVariable("x{}".format(i), lowBound=0, upBound=1, cat='Integer')
- for i in range(num_players)
- ]
- captain_decisions = [
- pulp.LpVariable("y{}".format(i), lowBound=0, upBound=1, cat='Integer')
- for i in range(num_players)
- ]
- # objective function:
- model += sum((captain_decisions[i] + decisions[i]) * expected_scores[i]
- for i in range(num_players)), "Objective"
- # cost constraint
- model += sum(decisions[i] * prices[i] for i in range(num_players)) <= 100 # total cost
- model += sum(decisions) == 11 # total team size
- # position constraints
- # 1 goalkeeper
- model += sum(decisions[i] for i in range(num_players) if positions[i] == 1) == 1
- # 3-5 defenders
- model += sum(decisions[i] for i in range(num_players) if positions[i] == 2) >= 3
- model += sum(decisions[i] for i in range(num_players) if positions[i] == 2) <= 5
- # 3-5 midfielders
- model += sum(decisions[i] for i in range(num_players) if positions[i] == 3) >= 3
- model += sum(decisions[i] for i in range(num_players) if positions[i] == 3) <= 5
- # 1-3 attackers
- model += sum(decisions[i] for i in range(num_players) if positions[i] == 4) >= 1
- model += sum(decisions[i] for i in range(num_players) if positions[i] == 4) <= 3
- # club constraint
- for club_id in np.unique(clubs):
- model += sum(decisions[i] for i in range(num_players) if clubs[i] == club_id) <= 3 # max 3 players
- model += sum(captain_decisions) == 1 # 1 captain
- for i in range(num_players): # captain must also be on team
- model += (decisions[i] - captain_decisions[i]) >= 0
- model.solve()
- return decisions, captain_decisions
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement