【问题标题】:How to constrain some columns to be all zeros in pulp如何将某些列限制为纸浆中的全零
【发布时间】:2019-08-18 01:07:27
【问题描述】:

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

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

我的问题是如何限制矩阵 A 中 j 列中的 n 列全为零。 n

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

纸浆在网上并不那么受欢迎。我找不到与我的问题相关的示例代码。谢谢你的回答。

【问题讨论】:

  • 我认为您将数据与决策变量混淆了。我建议先写一个数学模型。

标签: python linear-programming pulp


【解决方案1】:

对于每一列都有一个二进制变量,如果该列被使用则取值为 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

【讨论】:

  • 非常感谢!!你回答清楚,它解决了我的问题。
猜你喜欢
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多