所有可能的团队名单算法?和背包类似吗?

时间:2016-06-24 19:08:37

标签: python algorithm search

我一直致力于一个爱好项目,其中包括在尝试使用最大预测N teams时考虑到工资帽和玩家位置的限制,找到所有可能的团队名单。这是专门用于幻想足球的,但问题可以更广泛地解释为最大化问题。我找不到比使用嵌套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个弹性播放器(可以是一个 跑回来,一个紧凑的结束,或一个宽阔的接收器)
  • 总薪水必须是 < = N

我的算法的一般形式如下:

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标准的玩家的列表。

2 个答案:

答案 0 :(得分:4)

好的,按照要求,这是我的MIP模型,以找到最好的团队。

enter image description here

请注意,minposmaxpos表示我们想要为每个位置添加多少玩家。对于qb,我们有1 <= y(qb) <= 1,但rb2 <= y(rb) <= 3等等。集plpos表示玩家可以在哪个位置玩。

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

  1. 解决模型
  2. 如果有足够的解决方案:停止
  3. 向禁止当前解决方案的模型添加约束(cut
  4. 转到第1步
  5. 这种切割效果如何?让j成为解决方案中选择的玩家,即x*(j)=1。 (应该有9个)。然后剪切看起来像:sum_j x(j) <= 8。在算法的每一轮之后,我们添加一个新的切割(因此问题变得越来越大)。上述算法的每次迭代都为您提供了一种全新的,独特的最佳解决方案。

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

    enter image description here

答案 1 :(得分:2)

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