最小化输出数量



对于线性优化问题,我想包括一个惩罚。如果总和大于0和0,则每个选项的罚款(罚款[(i(](应为1,如果罚款为零,则应为0。有没有办法做到这一点?

罚款定义为:

penalties = {}
for i in A: 
    penalties[(i)]=(lpSum(choices[i][k] for k in B))/len(C)
prob += Objective Function + sum(penalties)

例如:

penalties[(0)]=0
penalties[(1)]=2
penalties[(3)]=6
penalties[(4)]=0

罚款的总和应为:

sum(penalties)=0+1+1+0= 2 

是。您需要做的是创建二进制变量:use_ith_row。如果i的任何choices[i][k]中的任何一个> = 0,则该变量的解释将为==1(和0否则(。

您的目标功能中的罚款术语只需sum(use_ith_row[i] for i in A)

您需要的最后一件事是执行上述规则的一组约束:

for i in A:
    lpSum(choices[i][k] for k in B) <= use_ith_row[i]*M

finnaly,您需要选择足够大的m,以使上述约束在use_ith_row为1时不会限制效果(通常可以很容易地解决此界限(。选择一个太大的M也将起作用,但往往会使您的问题解决较慢。

P.S。我不知道C是什么,或者为什么您要划分它的长度 - 但通常,如果这种罚款是其他/主要目标的次要,您会加重它,以便将主要目标的改善始终得到更大的重量。

最新更新