变量取负值,但限制为非负数

时间:2019-03-25 17:17:29

标签: python pulp

我正在使用PuLP在Python中编程车辆路径问题。我得到了所有代码,但是由于某种原因,尽管我将所有决策变量都限制为非负数,但我对其中一个决策变量却取了负值。

我的代码如下(Traveltimes是一个二维np数组,每对客户(i,j)之间的旅行时间,其中c(i,j)= c(j,i)和c(i, i)= 0。):

我的代码:

numVehicles = 2
numCustomers = 2


prob = LpProblem("DSP", LpMinimize)
var = [[[0 for k in range(numVehicles)] for j in range(numCustomers+1)] for i in range(numCustomers+1)]
for i in range(numCustomers+1):
    for j in range(numCustomers+1):
        for k in range(numVehicles):
            var[i][j][k] = LpVariable("x"+str(i)+","+str(j)+","+str(k), 0,1, cat='Binary')

# ADD OBJECTIVE
obj = ""
for i in range(numCustomers+1):
    for j in range(numCustomers+1):
        for k in range(numVehicles):
            obj += traveltimes[i][j]*var[i][j][k]
prob += obj

# ADD CONSTRAINTS

# All customers visited
for j in range(numCustomers+1):
    for k in range(numVehicles):
        nr = ""
        for i in range(numCustomers+1):
            nr += var[i][j][k] 
        prob += nr == 1

# Enter each customer exactly once
for i in range(numCustomers+1):
    nr = ""
    for k in range(numVehicles):
        for j in range(1, numCustomers+1):
            nr += var[i][j][k]
    prob += nr == 1

# Leave each customer exactly once
for j in range(numCustomers+1):
    nr = ""
    for k in range(numVehicles):
        for i in range(1, numCustomers+1):
            nr += var[i][j][k]
    prob += nr == 1

# Per vehicle only one customer can be visited as first
nrFirst = ""
for k in range(numVehicles):
    for j in range(numCustomers+1):
        nrFirst += var[0][j][k]
    prob += nrFirst <= 1

# Max num vehicles
nrOut = ""
for k in range(numVehicles):
    for j in range(numCustomers+1):
        nrOut += var[0][j][k]
prob += nrOut <= numVehicles

# Restrict x(0,j,k) to be nonpositive
for j in range(numCustomers+1):
    for k in range(numVehicles):
        prob += var[0][j][k] >= 0



print(prob)

# Solve LP
prob.solve()
for v in prob.variables(): 
    print(v.name, "=", v.varValue)
print("objective=", value(prob.objective))

第一个输出是打印的配方

MINIMIZE
1.731*x0,1,0 + 1.731*x0,1,1 + 2.983*x0,2,0 + 2.983*x0,2,1 + 1.731*x1,0,0 + 1.731*x1,0,1 + 9.375*x1,2,0 + 9.375*x1,2,1 + 2.983*x2,0,0 + 2.983*x2,0,1 + 9.375*x2,1,0 + 9.375*x2,1,1 + 0.0
SUBJECT TO
_C1: x0,0,0 + x1,0,0 + x2,0,0 = 1

_C2: x0,0,1 + x1,0,1 + x2,0,1 = 1

_C3: x0,1,0 + x1,1,0 + x2,1,0 = 1

_C4: x0,1,1 + x1,1,1 + x2,1,1 = 1

_C5: x0,2,0 + x1,2,0 + x2,2,0 = 1

_C6: x0,2,1 + x1,2,1 + x2,2,1 = 1

_C7: x0,1,0 + x0,1,1 + x0,2,0 + x0,2,1 <= 1

_C8: x1,1,0 + x1,1,1 + x1,2,0 + x1,2,1 <= 1

_C9: x2,1,0 + x2,1,1 + x2,2,0 + x2,2,1 <= 1

_C10: x0,0,0 + x0,1,0 + x0,2,0 <= 1

_C11: x0,0,0 + x0,0,1 + x0,1,0 + x0,1,1 + x0,2,0 + x0,2,1 <= 1

VARIABLES
0 <= x0,0,0 <= 1 Integer
0 <= x0,0,1 <= 1 Integer
0 <= x0,1,0 <= 1 Integer
0 <= x0,1,1 <= 1 Integer
0 <= x0,2,0 <= 1 Integer
0 <= x0,2,1 <= 1 Integer
0 <= x1,0,0 <= 1 Integer
0 <= x1,0,1 <= 1 Integer
0 <= x1,1,0 <= 1 Integer
0 <= x1,1,1 <= 1 Integer
0 <= x1,2,0 <= 1 Integer
0 <= x1,2,1 <= 1 Integer
0 <= x2,0,0 <= 1 Integer
0 <= x2,0,1 <= 1 Integer
0 <= x2,1,0 <= 1 Integer
0 <= x2,1,1 <= 1 Integer
0 <= x2,2,0 <= 1 Integer
0 <= x2,2,1 <= 1 Integer

可以清楚地看到,所有变量都被限制为0到1之间的整数(因此为二进制)。但是,由于某些原因,某些变量确实得到了负值,如下所示

x0,0,0 = 0.0
x0,0,1 = -1.0
x0,1,0 = 0.0
x0,1,1 = 1.0
x0,2,0 = 0.0
x0,2,1 = 1.0
x1,0,0 = 1.0
x1,0,1 = 1.0
x1,1,0 = 1.0
x1,1,1 = 0.0
x1,2,0 = 0.0
x1,2,1 = 0.0
x2,0,0 = 0.0
x2,0,1 = 1.0
x2,1,0 = 0.0
x2,1,1 = 0.0
x2,2,0 = 1.0
x2,2,1 = 0.0
objective= 11.159

因为我显然不希望出现负值,所以真的很期待有关解决此问题的任何建议!

2 个答案:

答案 0 :(得分:1)

正如其他一些人建议的那样,您应该写一个Minimum Complete and Verifiable Example

那就是说,如果您遇到违反约束的情况,并且您确定正确实施了约束,那么我认为您有一个不可行的问题(即,如果仔细查看约束,您会发现有一种组合可以解决问题)不可能)。

要检查此添加,请执行以下操作:

print (("Status:"), LpStatus[prob.status])

仅在您执行prob.solve()之后。我认为您会发现这是不可行的。

答案 1 :(得分:-1)

prob += nr == 1

“ + =”用于分配

“ ==”正在检查是否相等,并且属于“ if”语句或“ while”。

例如:

if prob + nr == 1: #execute what follows if prob + nr is equal to 1