最小化输出数量
Minimize the number of outputs
对于线性优化问题,我想加入一个惩罚项。如果总和大于 0,则每个选项的惩罚 (penalties[(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
。如果 choices[i][k]
中的任何一个对于 i
行 >= 0(否则为 0),则此变量的解释将是 ==1
。
objective 函数中的惩罚项只需 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
最后,您需要选择足够大的 M,以便当 use_ith_row
为 1 时,上面的约束没有限制作用(您通常可以很容易地计算出这个界限)。选择太大的 M
也可以,但往往会使您的问题解决速度变慢。
p.s。我不知道 C
是什么,也不知道为什么要除以它的长度 - 但通常如果这个惩罚对你来说是次要的 other/primary objective 你会对其进行加权,以便改善你的主要 objective总是被赋予更大的权重。
对于线性优化问题,我想加入一个惩罚项。如果总和大于 0,则每个选项的惩罚 (penalties[(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
。如果 choices[i][k]
中的任何一个对于 i
行 >= 0(否则为 0),则此变量的解释将是 ==1
。
objective 函数中的惩罚项只需 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
最后,您需要选择足够大的 M,以便当 use_ith_row
为 1 时,上面的约束没有限制作用(您通常可以很容易地计算出这个界限)。选择太大的 M
也可以,但往往会使您的问题解决速度变慢。
p.s。我不知道 C
是什么,也不知道为什么要除以它的长度 - 但通常如果这个惩罚对你来说是次要的 other/primary objective 你会对其进行加权,以便改善你的主要 objective总是被赋予更大的权重。