【问题标题】:All possible team rosters algorithm? Similar to knapsack maybe?所有可能的球队名单算法?可能类似于背包?
【发布时间】: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

我觉得有一个更优化的解决方案,但我就是想不出更多优化?即使在以低预测切割 wrsrbs 时,这仍然需要几个小时才能运行。

任何关于在哪里寻找或确认没有更有效的解决方案的想法都将非常感激。谢谢!

编辑:为澄清起见,我在 dst 循环内再次循环遍历 wrs、tes 和 rbs 以搜索 flex 播放器。这大大减少了搜索空间,而不是拥有所有符合 flex 条件的球员的列表。

【问题讨论】:

  • 您想要最好的解决方案(最佳投影)还是全部?我创建了一个小型 MIP(混合整数规划)模型,找到最好的模型需要零秒,
  • 这真的很棒,我很想看看。但我正在寻找 N 最好的阵容,所以不仅仅是 1,而是从 1 到 N

标签: python algorithm search


【解决方案1】:

好的,按照要求,这是我用来寻找最佳团队的 MIP 模型。

请注意,minposmaxpos 说明了我们希望每个位置有多少玩家。对于qb,我们有1 &lt;= y(qb) &lt;= 1,但对于rb2 &lt;= y(rb) &lt;= 3 等。集合plpos 表示玩家可以在哪个位置玩。

现在要找到额外的解决方案,我们可以使用一些最先进的求解器拥有的工具(例如 Cplex 有解决方案池技术),或者我们可以实现以下算法:

  1. 求解模型
  2. 如果有足够的解决方案:停止
  3. 向模型添加一个约束 (cut) 以禁止当前解决方案
  4. 转到步骤 1

这个剪裁看起来如何。让j 成为解决方案中选择的玩家集合,即x*(j)=1。 (应该有 9 个)。然后剪辑看起来像:sum_j x(j) &lt;= 8。在算法的每一轮之后,我们添加一个新的切割(因此问题变得越来越大)。上述算法的每次迭代都会为您提供一个新的、独特的、最佳的解决方案。

一组解决方案可能如下所示:

【讨论】:

  • 我一定要调查一下!感谢分享!如果我有任何进展,我会告诉你的!
【解决方案2】:

这看起来像 mathematical optimizationconstraint programming 问题。有许多库可以帮助您有效地解决这些类型的问题(分别参见 herehere)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    相关资源
    最近更新 更多