Python纸浆-唯一团队的数量约束
我是新手,因此在尝试进行条件约束时遇到了一个问题。我已经做了一个幻想足球优化器,可以选择9名球员的最佳选择,我的解算器目前完全可以处理职位限制、薪水限制等问题 最后我需要补充的是一个约束,使得它在挑选的9名球员中,需要有8名球员的唯一球队名称。例如:在我的代码Python纸浆-唯一团队的数量约束,python,pandas,optimization,linear-programming,pulp,Python,Pandas,Optimization,Linear Programming,Pulp,我是新手,因此在尝试进行条件约束时遇到了一个问题。我已经做了一个幻想足球优化器,可以选择9名球员的最佳选择,我的解算器目前完全可以处理职位限制、薪水限制等问题 最后我需要补充的是一个约束,使得它在挑选的9名球员中,需要有8名球员的唯一球队名称。例如:在我的代码######堆栈QB中,有一个四分卫和一个WR/TE将在同一个团队中。因此,其他每个人都应该在不同的团队中,每个人都有8个独特的团队名称 下面是我尝试使用的代码,用于进行此约束,excel文件的头部正在优化,我的代码迄今为止在没有约束的情况
######堆栈QB中,有一个四分卫和一个WR/TE将在同一个团队中。因此,其他每个人都应该在不同的团队中,每个人都有8个独特的团队名称
下面是我尝试使用的代码,用于进行此约束,excel文件的头部正在优化,我的代码迄今为止在没有约束的情况下工作,我希望在选定的9名球员中添加8个唯一的球队名称
我现在已经试过了,但是没有用!非常感谢您的帮助
list_of_teams = raw_data['Team'].unique()
team_vars = pulp.LpVariable.dicts('team', list_of_teams, cat = 'Binary')
for team in list_of_teams:
prob += pulp.lpSum([player_vars[i] for i in player_ids if raw_data['Team'][i] == team] + [-9*team_vars[team]]) <= 0
prob += pulp.lpSum([team_vars[t] for t in list_of_teams]) >= 8
list_of_teams=原始数据['Team'].unique()
team\u vars=plup.LpVariable.dicts('team',团队列表,cat='Binary')
对于团队列表中的团队:
prob+=plup.lpSum([player_vars[i]如果原始数据为玩家ID中的i['Team'][i]==Team]+[-9*Team_vars[Team]])=8
文件名='C:/Users/Michael Arena/Desktop/Football/Simulation.csv'
原始数据=pd.read\u csv(文件名,engine=“python”,index\u col=False,header=0,delimiter=“,”,quoting=3)
玩家ID=原始数据索引
player\u vars=plup.LpVariable.dicts('player',player\u id,cat='Binary')
prob=纸浆.LpProblem(“DFS优化器”,纸浆.LpProblem)
prob+=plup.lpSum([raw_data['Projection'][i]*player_vars[i]代表player_id中的i])
##总薪金上限:
prob+=plup.lpSum([raw_data['Salary'][i]*player_vars[i]代表player_id中的i])=49900
##总共有9名玩家:
prob+=plup.lpSum([player_vars[i]代表player_id中的i])==9
##2-3苏格兰皇家银行:
prob+=plup.lpSum([player_vars[i]表示player_id中的i,如果原始数据['Position'][i]='RB'])>=2
prob+=palp.lpSum([player_vars[i]表示player_id中的i,如果原始数据['Position'][i]='RB'])=3
prob+=palp.lpSum([player_vars[i]表示player_id中的i,如果原始数据['Position'][i]='WR'])以线性规划术语
如果选择了i^th
播放器,则设x_i=1
,否则设为0,i=1….i
让tui
成为i^th
玩家的团队,这是一个常数。
让t_j
成为j^th
唯一的团队,也是一个常量,j=1…t
如果t_i==t_j
,则设t_{ij}=1,否则设0。这也是一个常数
然后你可以说从球队中选出的球员总数是(t{1j}*x{1+t{1j}*x{2+…+t{Ij}*x{I)
,逻辑上取0到I之间的值
现在,如果有任何选定的玩家来自团队,则可以使用二进制变量y_j=1
,否则使用0,如下所示:
(t_{1j}*x_1 + t_{1j}*x_2 + ... + t_{Ij}*x_I) >= y_j
这会导致以下情况:
- 如果
(t_{1j}*x_1+t_{1j}*x_2+…+t_{Ij}*x_I)=0
,则y_j
为0李>
- 如果
(t_{1j}*x_1+t_{1j}*x_2+…+t_{Ij}*x_I)>0
,则y_j
可以是0或1
现在,如果您添加一个约束(y_1+y_2+…+y_T)>=8
,这意味着对于至少8个不同的团队(T_{1j}*x_1+T_{1j}*x_2+…+T_{Ij}*x_I)>0
在纸浆方面(类似这样的东西,无法测试)
如果player\u vars
是一个二进制变量,相当于x\u i
teams=raw_data['Team']#t#i
唯一团队=团队。唯一()
player_in_team=teams.str.get_dummies()#t_{ij}
#'teams=pd.Series(['A','B','C','D','E','F','A','C','E'])的输出示例:
#A B C D E F
# 0 1 0 0 0 0 0
# 1 0 1 0 0 0 0
# 2 0 0 1 0 0 0
# 3 0 0 0 1 0 0
# 4 0 0 0 0 1 0
# 5 0 0 0 0 0 1
# 6 1 0 0 0 0 0
# 7 0 0 1 0 0 0
# 8 0 0 0 0 1 0
team_vars=plup.LpVariable.dicts('team',unique_teams,cat='Binary')#y_j
对于独特团队中的团队:
prob+=纸浆lpSum(
[player_in_team[team][i]*player_vars[i]代表player_id中的i]
)>=团队成员[团队]
prob+=palp.lpSum([team_vars[t]代表唯一团队中的t])>=8
首先,我想说,感谢您抽出时间阅读并回答我的问题。我真的很感激。但是,当我现在看到你的代码时,我仍然很困惑(我不是最高级的程序员)。你能给出我需要实现的代码的解决方案吗?这会让我更容易理解它的工作原理。非常感谢!我添加了一个Python实现,但无法对其进行测试。希望它能帮助你把你的想法围绕在它周围谢谢你花时间来实现它,我想看看它是否有效,然后理解它,但是我在代码中遇到了一些错误。在for team in unique_teams
循环中,由于未定义I
,我得到一个名称错误。对于team_vars
循环中的for team,我遇到了一个语法问题,我不知道如何解决。对我的任何更正或建议都将非常感谢Hi Ruben,我一直在尝试许多不同的方法来让这段代码工作,我一直在努力实现它。非常感谢您的跟进!令人惊叹的!我现在开始工作了,我真的很感谢你的帮助!!!你能抽出时间真是太好了。祝你一切顺利
(t_{1j}*x_1 + t_{1j}*x_2 + ... + t_{Ij}*x_I) >= y_j