基于另一个变量约束纸浆二元变量选择

Constraining Pulp Binary Variable Selection Based on Another Variable

我正在为 Fantasy Football 创建优化脚本。开始时非常容易 - 加载玩家及其相关详细信息。

这个游戏的关键是你的小队可以选择 15 名球员,但每周只能派出 11 名球员。

我想要做的是有 2 个变量 - 一个定义球员在你的球队中,一个子变量决定你是否将球员放在你的首发 11 人中。

我已经尝试了一些方法 - 一个广泛的解决方案是有 2 个不相关的变量。 1 选择 11 个首发,第二个选择 4 个替补。这在 1 周内效果很好,但例如,一周内你队中的球员 A 可能是最好的首发球员,而下一周他在替补席上表现更好。因此,如果我可以使起始 11 变量成为 squad 变量的子集,我将获得更优的解决方案。

我附上了定义变量的代码以及我尝试创建一个将它们 link 在一起的约束。 (还有其他所有成功的限制条件。例如,我可以选择 11 人首发或 15 人小队来最大限度地提高预期结果,但我不能在 15 人小队中选择 11 人首发。

#VECTORS OF BINARY DECISIONS VARIABLES
squad_variables = []
for rownum in ID:
    variable = str('x' + str(rownum))
    variable = pulp.LpVariable(str(variable), lowBound = 0, upBound = 1, cat= 'Integer') 
    squad_variables.append(variable)

xi_variables = []
for rownum in ID:
    bariable = str('y' + str(rownum))
    bariable = pulp.LpVariable(str(bariable), lowBound = 0, upBound = 1, cat= 'Integer') 
    xi_variables.append(bariable)

下面的代码不适用于此任务,是问题的根源..

#ID CONSTRAINTS (ie. only 15 unique id selection across both systems)
id_usage = ""
for rownum in ID:
    for i, player in enumerate(squad_variables):
        if rownum == i:
            formula = max(1*xi_variables[rownum],(1*player))
            id_usage += formula
prob += (id_usage ==15)

任何帮助将不胜感激 - 也许这只是一个非线性问题。谢谢:)

您想要一个表示 "if x[i] = 0 then y[i] = 0" 的约束。执行此操作的典型方法是通过约束 y[i] <= x[i]。请注意,这仅在两个变量都是二进制时才有效;否则需要修改方法。我不能完全理解你的 PuLP 代码,所以我不会尝试为你提供这个约束的代码,但我假设你一旦理解了逻辑就能够实现它。