python - 最小化输出数量

标签 python pulp

对于线性优化问题,我想加入惩罚。如果总和大于 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。如果行 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

最后,您需要选择足够大的 M,以便当 use_ith_row 为 1 时,上述约束没有限制作用(您通常可以很容易地计算出这个界限)。选择太大的 M 也可以,但往往会使你的问题解决速度变慢。

附:我不知道 C 是什么,也不知道为什么除以它的长度 - 但通常情况下,如果这个惩罚对于你的其他/主要目标来说是次要的,你会对其进行加权,以便始终给出主要目标的改进重量更大。

关于python - 最小化输出数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57288073/

相关文章:

python - 将 Pandas DataFrame 转换为稀疏矩阵

python - PuLP 得到的结果是问题不可行,而问题不可行

python - 使用 PuLP 进行线性规划沙拉混合物优化

python - 使用 Pulp 在 Python 中识别不可行性约束并放松/删除它?

python - 运输优化(PuLP)

python - python 中 PuLP 库的多线程

python - 具有多种特征的多步时间序列预测

python - 以最有效的方式从数字 numpy 数组中获取 0 和 1(整数 bool 值)

python - 了解如何使用 tf.dataset.map()

python - 将数据写入 csv 不起作用