如何限制某些列在纸浆中全为零

How to constrain some columns to be all zeros in pulp

我正在研究 PulP 模块的线性规划问题。

在这个问题中,我们有一个 (i x j) 矩阵--A。 objective函数是最小化A和另一个(j x i)矩阵--B之间的产生式。 A是我们要最小化的目标,B是常数矩阵。

我的问题是如何限制矩阵 A 中的 n 列中的 j 列全为零。 n<=j 由用户设定。

prob 是我的 LpProblem,test 是矩阵 A,pri 是矩阵-B。 我知道如何创建每行总和必须为 1 的约束。

for i in range(pri.shape[1]):
    prob+=lpSum(test[i,:])==1

下面的代码是我如何尝试使矩阵 A 中 j 列的约束 n 全部为零。虽然,它失败了,只是创建了一个我无法理解原因的虚拟变量。

count=0
for i in range(pri.shape[0]):
    if lpSum(test[:,i])==0:
        count +=1
prob += count==n

prob.solve()
for v in prob.variables():
    print(v.name, "=", v.varValue)

输出:

__dummy = None
a_(1,_1) = 1.0
a_(1,_2) = 0.0
a_(2,_1) = 1.0
a_(2,_2) = 0.0
a_(3,_1) = 1.0
a_(3,_2) = 0.0

纸浆在网上不是很流行。我找不到与我的问题相关的示例代码。谢谢你的回答。

为每一列设置一个二进制变量,如果该列被使用则值为 1,否则为零。这可以通过为每一列 j 设置约束来完成,如下所示:

lpSum([test[i, j] for i in set_I]) <= M*binary[j]

其中 M 是一个选择得足够大的常数,当二进制值设置为 1.

时,此约束将不起作用

然后您还需要 1 个约束条件,即包含的列数不大于 n:

prob += lpSum([binary[j] for j in set_J]) <= n