PuLP MILP约束:至少一个变量必须小于0

时间:2018-08-20 22:36:36

标签: linear-programming pulp

我正在尝试向MILP问题添加约束,以确保至少一个决策变量小于0。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:2)

x_1, x_2,...,x_n为您的变量。
您希望至少x个变量之一的值小于零。 您可以通过以下方式实现。

我们不引入N个二进制变量y_1, y_2,...,y_n,每个x变量一个。
  为n个变量中的每一个添加一个约束,如下所示。

x_1 ≤ M * (1 - y_1)
x_2 ≤ M * (1 - y_2)
...
x_n ≤ M * (1 - y_n)
y_1 + y_2 + ... + y_n ≥ 1

其中M是一个大常数。 在最后一个约束条件下,您强制至少有一个y_i变量具有值y_i = 1,这将导致对应的x_i <= 0的{​​{1}}。

纸浆的例子如下。

x_i

输出:

import pulp 

N = 10
M = 1000

x = pulp.LpVariable.dicts("x", range(N), cat=pulp.LpInteger, upBound=10)    
y = pulp.LpVariable.dicts("y", range(N), cat=pulp.LpBinary)    

# Note the UB on the x variables in order not to make the problem unbounded
prob = pulp.LpProblem("example", pulp.LpMaximize)

prob += pulp.lpSum(x[i] for i in range(N))

for i in range(N):
   prob += x[i] <= M * (1 - y[i])

prob += pulp.lpSum(y[i] for i in range(N)) >= 1

prob.solve()

for i in range(N):
    print(x[i], x[i].varValue)