【问题标题】:Optimization problem - How to add same team constraint优化问题 - 如何添加相同的团队约束
【发布时间】:2020-06-05 15:11:08
【问题描述】:

数据集的样子:

我正在尝试为梦幻足球构建优化工具,但我很难强制模型使用来自同一支球队的球员。

9 名玩家组成一个阵容,需要低于 50k,我们正在最大化“proj”投影点

self.salary_cap = 50000
self.Minsalary_cap = 0
self.header = ['QB', 'RB', 'RB','WR', 'WR', 'WR', 'TE','FLEX', 'Def']

#define the pulp object problem
prob = pulp.LpProblem('NFL', pulp.LpMaximize)

#define the player variabless
players_lineup = [pulp.LpVariable("player_{}".format(i+1), cat="Binary") for i in range(self.num_players)]
QBs_lineup = [pulp.LpVariable("QB_{}".format(i+1), cat="Binary") for i in range(self.num_QBs)]
RBs_lineup = [pulp.LpVariable("RB_{}".format(i+1), cat="Binary") for i in range(self.num_RBs)]
WRs_lineup = [pulp.LpVariable("WR_{}".format(i+1), cat="Binary") for i in range(self.num_WRs)]
TEs_lineup = [pulp.LpVariable("TE_{}".format(i+1), cat="Binary") for i in range(self.num_TEs)]
FLEXs_lineup = [pulp.LpVariable("FLEX_{}".format(i+1), cat="Binary") for i in range(self.num_FLEXs)]
Defs_lineup = [pulp.LpVariable("Def_{}".format(i+1), cat="Binary") for i in range(self.num_Defs)]

#add the max player constraints
#prob += (pulp.lpSum(players_lineup[i] for i in range(self.num_players)) == 9)
prob += (pulp.lpSum(QBs_lineup[i] for i in range(self.num_QBs)) == 1)
prob += (pulp.lpSum(RBs_lineup[i] for i in range(self.num_RBs)) == 2)
prob += (pulp.lpSum(WRs_lineup[i] for i in range(self.num_WRs)) == 3)
prob += (pulp.lpSum(TEs_lineup[i] for i in range(self.num_TEs)) == 1)
prob += (pulp.lpSum(FLEXs_lineup[i] for i in range(self.num_FLEXs)) == 1)
prob += (pulp.lpSum(Defs_lineup[i] for i in range(self.num_Defs)) == 1)

#add the salary constraint
prob += (self.Minsalary_cap <= (pulp.lpSum(self.QBs.loc[i, 'sal']*QBs_lineup[i] for i in range(self.num_QBs))
         + pulp.lpSum(self.RBs.loc[i, 'sal']*RBs_lineup[i] for i in range(self.num_RBs))
         + pulp.lpSum(self.WRs.loc[i, 'sal']*WRs_lineup[i] for i in range(self.num_WRs))
         + pulp.lpSum(self.TEs.loc[i, 'sal']*TEs_lineup[i] for i in range(self.num_TEs))
         + pulp.lpSum(self.FLEXs.loc[i, 'sal']*FLEXs_lineup[i] for i in range(self.num_FLEXs))
         + pulp.lpSum(self.Defs.loc[i, 'sal']*Defs_lineup[i] for i in range(self.num_Defs))))


prob += ((pulp.lpSum(self.QBs.loc[i, 'sal']*QBs_lineup[i] for i in range(self.num_QBs))
         + pulp.lpSum(self.RBs.loc[i, 'sal']*RBs_lineup[i] for i in range(self.num_RBs))
         + pulp.lpSum(self.WRs.loc[i, 'sal']*WRs_lineup[i] for i in range(self.num_WRs))
         + pulp.lpSum(self.TEs.loc[i, 'sal']*TEs_lineup[i] for i in range(self.num_TEs))
         + pulp.lpSum(self.FLEXs.loc[i, 'sal']*FLEXs_lineup[i] for i in range(self.num_FLEXs))
         + pulp.lpSum(self.Defs.loc[i, 'sal']*Defs_lineup[i] for i in range(self.num_Defs))) <= self.salary_cap)

我面临的问题是我将如何强制它让 QB 和 WR 在同一个团队中?

【问题讨论】:

    标签: python optimization dynamic-programming knapsack-problem pulp


    【解决方案1】:

    如果我理解正确,你想控制,如果 QB 来自 X 队,那么至少有一个来自 X 队的 WR。或者围绕这个。

    然后您可以强制每个团队从该团队中选择的 QB 的总和大于从该团队中选择的 WR 的数量。

    # teams is the list of all teams
    teams = []
    
    # we fill a dictionary that, for each team, stores a list of the players on that team.
    QBs_from_team = {team: [player for player in QBs[QBs['team']==team]] for team in teams}
    WRs_from_team = {team: [player for player in WRs[WRs['team']==team]] for team in teams}
    
    # then you can create the pulp constraint:
    
    # if QB is from team "X", then at least one WR will be from that team
    for team in teams:
        prob += pulp.lpSum(QBs_lineup[player] for player in QBs_from_team[team]) <= \
                pulp.lpSum(WRs_lineup[player] for player in WRs_from_team[team])
    
    # if all 3 WR need to be from the team, just add a 3 multiplying the number of QB.
    
    

    如果你想要别的东西,也许这个限制会激发你去构思它。如果没有,请随时在您的问题中提供更多信息。

    【讨论】:

      猜你喜欢
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多