纸浆约束:至少有一个团队满足最低标准

PULP Constraint: At least one team to meet meet minimum criteria

我有一个阵容生成器,我试图在其中添加一个约束条件,使我生成的每个阵容至少有 3 名属于同一球队的球员。

例如:生成器共有 60 名球员可供选择(10 个人来自 6 个不同的球队),我不希望它构建的阵容(每个阵容有 9 名球员)有效,除非一个的球队在 ​​9 个位置中至少有 3 个出现。

我目前能够确保它不允许任何一支球队超过 5 名球员,但我不确定如何强制至少一支球队的最低人数。

我目前每个团队的最大限制如下:

    used_team = [pulp.LpVariable("u{}".format(i + 1), cat="Binary") for i in range(self.num_teams)]
    for i in range(self.num_teams):
        prob += (used_team[i] <= pulp.lpSum(
            self.players_teams[k][i] * players_lineup[k] for k in range(self.num_players)))
        prob += (pulp.lpSum(self.players_teams[k][i] * players_lineup[k] for k in range(self.num_players)) <= max_per_team *
                    used_team[i])

您提供的约束成功地在有活跃玩家时强制 used_team 变量处于活动状态,将这些活跃玩家限制在上限,并在有玩家时强制 used_team 关闭没有活跃玩家。

为确保您的其他约束,您需要为每支球队添加一个额外的二进制变量 used_3_in_team,指示是否达到该球队的 3 名球员。然后你需要做类似下面的事情来添加约束。

for i in range(self.num_teams):
        prob += (3*used_3_in_team[i] <= pulp.lpSum(
            self.players_teams[k][i] * players_lineup[k] for k in range(self.num_players)))
prob += pulp.lpSum(self.used_3_in_team) >= 1

第一组不等式迫使 used_3_in_team 仅在至少选择了 3 名玩家时才处于活动状态。最后一个不等式确保至少有一支球队至少有 3 名球员活跃。

希望这能解决您的问题。

由于您没有提供最低限度的工作示例,所以我没有检查我的代码,但我希望思路清晰。