I'm trying to implement a rather complicated application of this. I'm trying to do a fantasy football draft. I have a class for the draft, league members, and nfl players. Everytime it is my turn to draft, I want to simulate the entire draft to determine the best possible pick. Can somebody try to point me in the right direction? I feel like I'm really close. I've added only a few members and players and set the number of rounds to 2 for testing. Obviously these classes are bare bones and I would have to make some more constraints. I'm just trying to get logic to work. Thanks.
from __future__ import division
from copy import deepcopy
from mcts import mcts
from functools import reduce
import operator
# Class for a Member of a League. Has a name, draft position, and me = True if member is me
class Member:
def __init__(self,name,draft_pos,me=False):
self.name = name
self.draft_pos = draft_pos
self.me = me
self.roster = []
@property
def total_pts(self):
return sum([p.proj for p in self.roster])
# Class for a NFL Player. Has a name, team, position, and projected Points.
class Player:
def __init__(self,name,team,pos,proj):
self.name = name
self.team = team
self.pos = pos
self.proj = proj
self.drafted = False
def __repr__(self):
return f'{self.name} {self.proj}'
# Class for a Draft. Has members, players, and number of rounds
class Draft:
def __init__(self,members,players,num_rounds):
self.members = members
self.players = players
self.num_rounds = num_rounds
# Get Players that have been drafted
@property
def drafted_players(self):
return [p for p in self.players if p.drafted == True]
# Get Players that are undrafted
@property
def undrafted_players(self):
return [p for p in self.players if p.drafted == False]
# Get current overall pick in draft
@property
def current_overall_pick(self):
return len(self.drafted_players) + 1
# Get current round of draft
@property
def current_round(self):
return ((self.current_overall_pick -1) // len(self.members)) + 1
# Get current pick in the round
@property
def current_pick_in_round(self):
return self.current_overall_pick - (len(self.members)*(self.current_round - 1))
# Get the member that is currently drafting
@property
def current_member_drafting(self):
if self.current_round % 2 != 0:
return next((m for m in self.members if m.draft_pos == self.current_pick_in_round), None)
elif self.current_round % 2 == 0:
return next((m for m in self.members if m.draft_pos == (len(self.members) - self.current_pick_in_round + 1)), None)
# Draft a player to the member that is currently drafting
def draft_player(self,player):
self.current_member_drafting.roster.append(player)
print(f'{self.current_member_drafting.name} drafted {player.name}')
player.drafted = True
# If I am drafting, return 1, else return -1
def getCurrentPlayer(self):
if self.current_member_drafting.me == True:
return 1
else:
return -1
# Get a list of all players available to draft
def getPossibleActions(self):
possible_actions = []
for player in self.undrafted_players:
possible_actions.append(player)
return possible_actions
# Create copy of state and draft player to the current member drafting
def takeAction(self,action):
new = deepcopy(self)
new.draft_player(action)
return new
# Node is terminal when all teams are full
def isTerminal(self):
if all(len(m.roster) == self.num_rounds for m in self.members):
return True
else:
return False
def getReward(self):
me = next((m for m in self.members if m.me == True), None)
others = [m for m in self.members if m.me == False]
if all(me.total_pts > m.total_pts for m in others):
return 1
else:
return False
if __name__=="__main__":
m1 = Member('m1',1,me=True)
m2 = Member('m2',2)
m3 = Member('m3',3)
members = [m1,m2,m3]
p1 = Player('Tom Brady','TB','QB',300)
p2 = Player('Josh Allen','BUF','QB',325)
p3 = Player('Russell Wilson','DEN','QB',275)
p4 = Player('Mac Jones','NE','QB',350)
p5 = Player('Matt Ryan','DEN','QB',250)
p6 = Player('Drew Lock','NE','QB',225)
players = [p1,p2,p3,p4,p5,p6]
draft = Draft(members,players,num_rounds=2)
searcher = mcts(iterationLimit=10)
action = searcher.search(initialState=draft)
print(action)