PuLP 优化问题 - 如何添加约束?

PuLP Optimization problem - how to add constraints?

我正在尝试解决具有以下约束的线性规划问题: 对于 NT 的某些给定值。所以假设 N={1,2}T={1,2} |N|小的容易写出来,N大了就写不出来了。

我对如何通过索引我的 objective 变量来实际编码这些总和感到困惑。

我使用以下内容创建我的 objective 变量:

for t in range(1,T+1):
    for i in range(1,n+1):
        for j in range(1,n+1):
            # Skip the x_i,i,t entries
            if j == i:
                continue
            element = "x"+str(i)+','+str(j)+','+str(t)
            x_ijt_holding.append(element)
            
x_ijt =[]
for i in x_ijt_holding:
    x_ijt.append(pulp.LpVariable(i, cat = "Binary"))

最初我以为我可以用 LpVariable 定义每个约束,但我意识到求解器不喜欢这样。

例如我做了:

# Constraint 2 enter entries
x_ijt_2_holding = []
for j in range(1,n+1):
    for i in range(1,j):
        equations_2 = []
        equations_3 = []
        for t in range(1, T+1):
            equations_2.append("x"+str(i)+','+str(j)+','+str(t))
            equations_2.append("x"+str(j)+','+str(i)+','+str(t))
        x_ijt_2_holding.append(equations_2)
        
# Constraint 2 as LpVariable:
for i in x_ijt_2_holding:
    temp = []
    for sublist in i:
        temp.append(pulp.LpVariable(sublist, cat = "Binary"))
x_ijt_con2.append(temp)

那么我该如何将约束编码到问题中呢?

约束定义了先前定义为方程式的变量的关系。当您构建约束时,您需要引用您在第一部分中定义的变量。将您的变量保存在字典中可以使以后更容易引用您的变量。

看看这个

"""
Optimizing

sum(x[i][j][t] + x[j][i][t]) ==1 where j in N \ {i} for each i in N and for each t in T
sum(x[i][j][t] + x[j][i][t]) ==2 where t in T for each i,j in N, i < j

programmer Michael Gibbs
"""

import pulp

N = [1,2]
T = [1,2]

model = pulp.LpProblem("basis")

# variables
# x[i][j][t]
x = {
    i:{
        j:{
            t:pulp.LpVariable(
                'x_' + str(i) + '_' + str(j) + '_' + str(t),
                cat=pulp.LpBinary
            )
            for t in T
        }
        for j in N if j != i
    }
    for i in N
}

# constraints
#sum(x[i][j][t] + x[j][i][t]) ==1 where j in N \ {i} for each i in N and for each t in T
for i in N:
    for t in T:
        c = pulp.lpSum([x[i][j][t] + x[j][i][t] for j in N if j != i]) == 1
        model += c

#sum(x[i][j][t] + x[j][i][t]) ==2 where t in T for each i,j in N, i < j
for i in N:
    for j in N:
        if i < j:
            c = pulp.lpSum([x[i][j][t] + x[j][i][t] for t in T]) == 2
            model += c

# no objective

model.solve()

print("i","j","t","value")
print('-------------------')
[print(i,j,t, pulp.value(x[i][j][t])) for i in N for j in N if i != j for t in T]