我一直致力于一个爱好项目,其中包括在尝试使用最大预测N teams
时考虑到工资帽和玩家位置的限制,找到所有可能的团队名单。这是专门用于幻想足球的,但问题可以更广泛地解释为最大化问题。我找不到比使用嵌套for循环更有效的解决方案。我使用python词典按qbs[playerName] = {Salary: X, Projection: Y}
和rbs[playerName] = {Salary: X, Projection: Y}
等位置跟踪特定的玩家数据。
约束如下:
我的算法的一般形式如下:
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标准的玩家的列表。
答案 0 :(得分:4)
好的,按照要求,这是我的MIP模型,以找到最好的团队。
请注意,minpos
和maxpos
表示我们想要为每个位置添加多少玩家。对于qb
,我们有1 <= y(qb) <= 1
,但rb
:2 <= y(rb) <= 3
等等。集plpos
表示玩家可以在哪个位置玩。
现在要找到其他解决方案,我们可以使用一些最先进的求解器所具有的工具(例如Cplex有解决方案池技术),或者我们可以实现以下算法:
答案 1 :(得分:2)
这看起来像mathematical optimization或constraint programming问题。有许多库可以帮助您有效地解决这些类型的问题(分别参见here和here)。