我正在为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)
任何帮助将不胜感激-也许这仅仅是一个非线性问题。谢谢:)
答案 0 :(得分:0)
您想要一个约束条件为“如果x[i] = 0
则y[i] = 0
”。典型的方法是通过约束y[i] <= x[i]
。请注意,这仅在两个变量均为二进制时才有效;否则,必须采用改进的方法。我不太了解您的PuLP
代码,因此我不会尝试为您提供此约束的代码,但是我想您一理解逻辑就可以实现它。