优化问题--如何增加同一团队的约束。

问题描述 投票:0回答:1

数据集是怎样的。

The dataset

我想为梦幻橄榄球建立一个优化工具 但我很难强迫模型使用同一支球队的球员。

9名球员组成一个阵容,需要在5万以下,而我们要最大化 "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个回答
0
投票

如果我理解正确的话,你想控制,如果QB来自X队,有 起码 X队的一个外接手,或者类似于这样。

然后你可以强制执行,对于每支球队来说,来自该队的入选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 = {t: [player for player in QBs[QBs['team']==t]] for t in teams}
WRs_from_team = {}

# 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[t]) <= \
            pulp.lpSum(WRs_lineup[player] for player in WRs_from_team[t])

# if all 3 WR need to be from the team, just add a 3 multiplying the number of QB.

如果你想要其他的东西,也许这个限制会让你有灵感去构思它。如果没有,欢迎在你的问题中提供更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.