优化问题-如何添加相同的团队约束 [英] Optimization problem - How to add same team constraint

查看:102
本文介绍了优化问题-如何添加相同的团队约束的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

数据集的样子:

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

I'm trying to build an optimization tool for fantasy football, but I'm having difficulty forcing the model to use players from the same team.

9名球员组成一个阵容,需要保证50k,我们将 proj最大化预计点数

9 players form a lineup, need to be under 50k and we are maximizing "proj" projected points

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和

The problem I'm facing is how would I force it to make the QB and a WR on the same team?

推荐答案

如果我正确理解,您想控制的是,如果QB来自X团队, X团队至少有 个WR。

If I understood correctly, you want to control that, if QB is from team X, there is at least one WR from team X. Or something around this.

然后,您可以强制每个团队从该团队中选择QB的总和为

Then you could enforce that for each team the sum of selected QB from that team is greater than the number of selected WR from that team.

# 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.

如果您想要其他东西,也许这种约束会激发您的构想。如果没有,请随时在您的问题中提供更多信息。

If you want something else, maybe this constraint inspires you to conceive it. If it doesn't, feel free to give more information in your question.

这篇关于优化问题-如何添加相同的团队约束的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆