Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python纸浆-唯一团队的数量约束_Python_Pandas_Optimization_Linear Programming_Pulp - Fatal编程技术网

Python纸浆-唯一团队的数量约束

Python纸浆-唯一团队的数量约束,python,pandas,optimization,linear-programming,pulp,Python,Pandas,Optimization,Linear Programming,Pulp,我是新手,因此在尝试进行条件约束时遇到了一个问题。我已经做了一个幻想足球优化器,可以选择9名球员的最佳选择,我的解算器目前完全可以处理职位限制、薪水限制等问题 最后我需要补充的是一个约束,使得它在挑选的9名球员中,需要有8名球员的唯一球队名称。例如:在我的代码######堆栈QB中,有一个四分卫和一个WR/TE将在同一个团队中。因此,其他每个人都应该在不同的团队中,每个人都有8个独特的团队名称 下面是我尝试使用的代码,用于进行此约束,excel文件的头部正在优化,我的代码迄今为止在没有约束的情况

我是新手,因此在尝试进行条件约束时遇到了一个问题。我已经做了一个幻想足球优化器,可以选择9名球员的最佳选择,我的解算器目前完全可以处理职位限制、薪水限制等问题

最后我需要补充的是一个约束,使得它在挑选的9名球员中,需要有8名球员的唯一球队名称。例如:在我的代码
######堆栈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