【发布时间】:2016-10-27 11:50:24
【问题描述】:
一段时间以来,我一直在从事一个爱好项目,该项目涉及在考虑到工资帽和球员位置的限制的情况下找到所有可能的球队名单,同时尝试以最大的预测 Nteams。这是专门针对梦幻足球的,但问题可以更概括为最大化问题。我找不到比使用嵌套 for 循环更有效的解决方案。我正在使用 python 字典按qbs[playerName] = {Salary: X, Projection: Y} 和rbs[playerName] = {Salary: X, Projection: Y} 等位置跟踪特定玩家数据。
约束如下:
- 1 个四分卫 (qb)
- 2名跑卫(rb1, rb2)
- 3 个宽接收器(wr1, wr2, wr3)
- 1 个紧端 (te)
- 1 防御 (dst)
- 1 个弹性播放器(可以是 跑卫、近端锋或外接手)
- 总工资必须是
我的算法的一般形式如下:
def optimize(teams):
for qb in qbs:
iter_rb = itertools.combinations(rbs,2)
for rb1, rb2 in iter_rb:
iter_wr = itertools.combinations(wrs,3)
for wr1, wr2, wr3 in iter_wr:
for te in tes:
for dst in dsts:
baseSalary = qb['Salary'] + rb1['Salary'] + rb2['Salary'] + wr1['Salary'] + wr2['Salary'] + wr3['Salary'] + te['Salary'] + dst['Salary']
baseProjection = qb['Projection'] + rb1['Projection'] + rb2['Projection'] + wr1['Projection'] + wr2['Projection'] + wr3['Projection'] + te['Projection'] + dst['Projection']
if baseSalary <= maxSalary:
for rb3 in rbs:
salary = baseSalary + rb3['Salary']
if salary <= maxSalary:
projection = baseProjection + rb3['Projection']
if projection > teams[-1].projection:
insertTeamAndReorderList()
for wr4 in wrs:
salary = baseSalary + wr4['Salary']
if salary <= maxSalary:
projection = baseProjection + wr4['Projection']
if projection > teams[-1].projection:
insertTeamAndReorderList()
for te2 in tes:
salary = baseSalary + te2['Salary']
if salary <= maxSalary:
projection = baseProjection + te2['Projection']
if projection > teams[-1].projection:
insertTeamAndReorderList()
return teams
我觉得有一个更优化的解决方案,但我就是想不出更多优化?即使在以低预测切割 wrs 和 rbs 时,这仍然需要几个小时才能运行。
任何关于在哪里寻找或确认没有更有效的解决方案的想法都将非常感激。谢谢!
编辑:为澄清起见,我在 dst 循环内再次循环遍历 wrs、tes 和 rbs 以搜索 flex 播放器。这大大减少了搜索空间,而不是拥有所有符合 flex 条件的球员的列表。
【问题讨论】:
-
您想要最好的解决方案(最佳投影)还是全部?我创建了一个小型 MIP(混合整数规划)模型,找到最好的模型需要零秒,
-
这真的很棒,我很想看看。但我正在寻找 N 最好的阵容,所以不仅仅是 1,而是从 1 到 N