DimaKudosh / pydfs-lineup-optimizer

Daily Fantasy Sports lineup optimzer for all popular daily fantasy sports sites
MIT License
418 stars 157 forks source link

GenerateLineupException: Can't generate lineups. Following constraints are not valid: total_players,positions_MVP #282

Closed lightninglarry closed 3 years ago

lightninglarry commented 3 years ago

is there a limit on how many playersgroup the MMA optimizer can handle?

doesnt like this code until i comment out a few of my groupings, then it takes off.

see code below fight1= PlayersGroup([optimizer.get_player_by_name(Nickname) for Nickname in ('Cory Sandhagen', 'TJ Dillashaw')], max_from_group=1, min_from_group=1) optimizer.add_players_group(fight1)

fight2= PlayersGroup([optimizer.get_player_by_name(Nickname) for Nickname in ('Raulian Paiva', 'Kyler Phillips')], max_from_group=1, min_from_group=1)

optimizer.add_players_group(fight2)

fight3= PlayersGroup([optimizer.get_player_by_name(Nickname) for Nickname in ('Darren Elkins', 'Darrick Minner')], max_from_group=1, min_from_group=1) optimizer.add_players_group(fight3)

fight4= PlayersGroup([optimizer.get_player_by_name(Nickname) for Nickname in ('Maycee Barber', 'Miranda Maverick')], max_from_group=1, min_from_group=1) optimizer.add_players_group(fight4)

fight5= PlayersGroup([optimizer.get_player_by_name(Nickname) for Nickname in ('Randy Costa', 'Adrian Yanez')], max_from_group=1, min_from_group=1)

optimizer.add_players_group(fight5)

fight6= PlayersGroup([optimizer.get_player_by_name(Nickname) for Nickname in ('Punahele Soriano', 'Brendan Allen')], max_from_group=1, min_from_group=1)

optimizer.add_players_group(fight6)

fight7= PlayersGroup([optimizer.get_player_by_name(Nickname) for Nickname in ('Nassourdine Imavov', 'Ian Heinisch')], max_from_group=1, min_from_group=1) optimizer.add_players_group(fight7)

fight8= PlayersGroup([optimizer.get_player_by_name(Nickname) for Nickname in ('Jordan Williams', 'Mickey Gall')], max_from_group=1, min_from_group=1)

optimizer.add_players_group(fight8)

fight9= PlayersGroup([optimizer.get_player_by_name(Nickname) for Nickname in ('Andre Ewell', 'Julio Arce')], max_from_group=1, min_from_group=1)

optimizer.add_players_group(fight9)

fight10= PlayersGroup([optimizer.get_player_by_name(Nickname) for Nickname in ('Sijara Eubanks', 'Elise Reed')], max_from_group=1, min_from_group=1)

optimizer.add_players_group(fight10)

fight11= PlayersGroup([optimizer.get_player_by_name(Nickname) for Nickname in ('Hannah Goldy', 'Diana Belbita')], max_from_group=1, min_from_group=1) optimizer.add_players_group(fight11)

sandhagen = optimizer.get_player_by_name("Cory Sandhagen")

optimizer.add_player_to_lineup(sandhagen)

sandhagen.max_exposure = 1

sandhagen.min_exposure = .66

yanez = optimizer.get_player_by_name("Adrian Yanez")

optimizer.add_player_to_lineup(yanez)

yanez.max_exposure = 1

yanez.min_exposure = .50

soriano = optimizer.get_player_by_name("Punahele Soriano")

optimizer.add_player_to_lineup(soriano)

soriano.max_exposure = 1

soriano.min_exposure = .50

lineups = optimizer.optimize(n=500)

optimizer.set_min_salary_cap(59300)

for lineup in lineups: print(lineup) optimizer.export(r"C:\Users\brand\Desktop\PYTHON\UFC\UPLOAD.csv") import pandas as pd df = pd.read_csv(r"C:\Users\brand\Desktop\PYTHON\UFC\UPLOAD.csv") optimizer.print_statistic()

would be so much easier if fanduel included their opponent in the csv

DimaKudosh commented 3 years ago

You set min_from_group for each group, which means that at least one player should appear from each group, but you have more groups than roster slots, you can try to remove min_from_group.

lightninglarry commented 3 years ago

Cant decypher my error after i fixed the above issue @DimaKudosh KeyError Traceback (most recent call last)

in 68 lineups = optimizer.optimize(n=50) 69 optimizer.set_min_salary_cap(90) ---> 70 for lineup in lineups: 71 print(lineup) 72 optimizer.export(r"C:\Users\brand\Desktop\PYTHON\UFC\UPLOAD.csv") ~\anaconda3\lib\site-packages\pydfs_lineup_optimizer\lineup_optimizer.py in optimize(self, n, max_exposure, randomness, with_injured, exposure_strategy) 385 constraints = [constraint(self, players_dict, context) for constraint in rules] 386 for constraint in constraints: --> 387 constraint.apply(base_solver) 388 previous_lineup = None 389 for _ in range(n): ~\anaconda3\lib\site-packages\pydfs_lineup_optimizer\rules.py in apply(self, solver) 294 def apply(self, solver): 295 if not self.with_exposures: --> 296 self._create_constraints(solver) 297 298 def apply_for_iteration(self, solver, result): ~\anaconda3\lib\site-packages\pydfs_lineup_optimizer\rules.py in _create_constraints(self, solver) 328 combinations_variables[group_name] = solver_variable 329 for group_players, group_min, group_max in sub_groups: --> 330 variables = [self.players_dict[p] for p in group_players] 331 if group_min is not None: 332 if not stack.can_intersect: ~\anaconda3\lib\site-packages\pydfs_lineup_optimizer\rules.py in (.0) 328 combinations_variables[group_name] = solver_variable 329 for group_players, group_min, group_max in sub_groups: --> 330 variables = [self.players_dict[p] for p in group_players] 331 if group_min is not None: 332 if not stack.can_intersect: KeyError: None -What should i be looking for?
DimaKudosh commented 3 years ago

Looks like you add a not-exist player to the group because your script failed when iterating over your group and found None. get_player_by_name can return None if a player with provided name doesn't exist.

lightninglarry commented 3 years ago

good catch @DimaKudosh . Closing issue now. Thanks