如何限制某些列在纸浆中全为零
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
我正在研究 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