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

时间:2019-05-11 13:16:13

标签: python linear-programming pulp

我正在为Fantasy Football创建优化脚本。它非常容易开始-将其及其相关详细信息加载到播放器中。

该游戏的关键是您的班级可以选择15名球员,但每周只能选拔11名球员。

我想做的是有2个变量-一个变量定义球员在您的阵容中,另一个子变量确定您是否将其放在前11名中。

我尝试了一些方法-一种广泛的解决方案是具有2个不相关的变量。 1个选择11个启动器,第二个选择4个子。这在1周内效果很好,但是例如,从您的球队开始,一个星期的球员A可能是最好的开始,而下一个他在板凳上则更好。因此,如果我可以将开始的11个变量设为小队变量的子集,那我将获得一个更好的解决方案。

我已经附上了定义变量的代码,并尝试创建将它们链接在一起的约束。 (还有其他所有条件都可以成功起作用。例如,我可以选择一个起点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)

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

1 个答案:

答案 0 :(得分:0)

您想要一个约束条件为“如果x[i] = 0y[i] = 0”。典型的方法是通过约束y[i] <= x[i]。请注意,这仅在两个变量均为二进制时才有效;否则,必须采用改进的方法。我不太了解您的PuLP代码,因此我不会尝试为您提供此约束的代码,但是我想您一理解逻辑就可以实现它。