【问题标题】:Combinatorial optimization for selecting the players of a football team选择足球队球员的组合优化
【发布时间】:2020-12-27 07:42:20
【问题描述】:

我正在考虑使用整数规划来生成足球运动员的最佳组合以组成一个团队。

虽然问题本身很简单,但我无法为职位资格制定有效的约束条件。

我在 stackoverflow 中搜索了经典整数规划问题的变体,并提出了一个临时解决方案,但想验证当前解决方案是否有效。

问题
从一组有限的潜在球员中选择 11 名球员加入足球(足球)队。
球队由11个位置组成:5个进攻、5个防守和1个守门员。
每个角色都有自己的合格玩家池。
(例如,守门员只能从一组有手套的球员中选择)
每个玩家都被分配了一个代表他们技能的“技能分数”

目标函数
最大化:所有 11 名玩家技能分数的总和

约束

  1. 所有 11 个插槽必须至少有 1 名玩家填满
  2. 1 名玩家只能占用 1 个位置
  3. 每个位置都必须由有资格担任该角色的玩家填补

我的临时解决方案

Let xij: player i in consideration for slot j (j=1, 2,..., 11, 1 <= i <= n)
and w: n x 1 weight matrix representing skill score for player i

1. sum_j(xij) == 1 for each slot j
2. 0 <= sum_i(xij) <= 1 for each player i
3. 0 <= xij <= 1 if player i is eligible for slot j, == 0 otherwise

maximize sum(wTx)

我还没有想到一种优雅的方式来操作 3,所以我现在的答案是将每个单元格硬编码为 0。

我打算在 Python 中使用整数编程库(cvxpy 或 PuLP)。

当前的设计会导致收敛或计算时间方面的任何问题吗?

是否有更有效的方法来建模问题?

备注

  • 为简单起见,我们假设玩家可以同时担任多个角色,但他们的技能点不会因角色而异
  • 如果玩家的技能分数根据他们与其他玩家的协同作用而改变,问题的表述会改变吗?我认为通过 nC2 可能的交互来简单地扩展 x 矩阵是可行的,但我很好奇是否有更好的解决方案。

【问题讨论】:

    标签: algorithm mathematical-optimization combinatorics knapsack-problem mixed-integer-programming


    【解决方案1】:

    您的 IP 表述看起来不错。但是,这个问题也可以使用动态规划来解决:

    让数组dp[n][mask] 表示将玩家从 1 到 n 放置到mask 二进制表示中的 0 位对应的位置时可以获得的最大可能分数。例如dp[5][0b11111110101] 等于将玩家 1 到 5 放置到位置 2 和 4 所获得的最高分数。(掩码的第二和第四位为零。)

    现在我们递归定义dp[n][mask]

    dp[n][mask] = max{
        dp[n-1][mask], # the case when we don't use player n
        max_j{ dp[n-1][mask|(1<<j)] + w[n] } (1 <= j <= 11 and mask's jth bit is 0)
    }
    

    基本情况是n=0

    dp[0][mask] = {
        -infinity, if there are 0 bits in mask # there are empty positions left, we want to strictly discourage this case.
        0, if all 11 bits of mask is 1
    }
    

    【讨论】:

      猜你喜欢
      • 2012-12-11
      • 2011-06-22
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多