变量取负值,而它被限制为非负值

问题描述 投票:0回答:2

我正在使用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

真的很期待有关如何解决这个问题的任何建议,因为我显然不想要负值!

python pulp
2个回答
1
投票

正如其他一些人建议你应该写一个Minimum Complete and Verifiable Example

也就是说,如果你违反约束条件,并且你确定你已经正确地实现了它们,我认为你有一个不可行的问题(即如果你仔细研究你的约束,你会发现有一个组合使得解决不可能)。

要检查这个添加:

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

就在你做prob.solve()之后。我估计你会发现它是不可行的。


-1
投票
prob += nr == 1

“+ =”用于分配

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

例如:

if prob + nr == 1: #execute what follows if prob + nr is equal to 1
© www.soinside.com 2019 - 2024. All rights reserved.