我正在尝试用puLP(Python)来解决MILP问题,并不断出现以下错误:
Traceback (most recent call last):
File "main_lp.py", line 63, in <module>
ans = solve_lp(C)
File "/home/ashwin/Documents/Williams/f2014/math317_or/project/solve_lp.py", line 36, in solve_lp
prob.solve()
File "/usr/local/lib/python2.7/dist-packages/PuLP-1.5.6-py2.7.egg/pulp/pulp.py", line 1619, in solve
status = solver.actualSolve(self, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/PuLP-1.5.6-py2.7.egg/pulp/solvers.py", line 1283, in actualSolve
return self.solve_CBC(lp, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/PuLP-1.5.6-py2.7.egg/pulp/solvers.py", line 1346, in solve_CBC
raise PulpSolverError("Pulp: Error while executing "+self.path)
pulp.solvers.PulpSolverError: Pulp: Error while executing /usr/local/lib/python2.7/dist-packages/PuLP-1.5.6-py2.7.egg/pulp/solverdir/cbc-32
对于我的线性规划问题,我试图把不同向量的和作为约束,我想我一定是做得不对,因为一个简单得多的问题工作时没有牵绊。我附加了代码(C
是一个N×Nnumpy
数组)。
def solve_lp(C):
N = len(C)
prob=LpProblem('Scheduling',LpMinimize)
X = [[LpVariable('X' + str(i+1) + str(j+1), 0, C[i,j],LpBinary)
for j in range(N)] for i in range(N)]
X = np.array(X)
X_o = [LpVariable('X0' + str(i), 0, None, LpBinary) for i in range(N)]
X_t = [LpVariable('X' + str(i) + 't', 0, None, LpBinary) for i in range(N)]
# Objective Function
ones_vec = list(np.ones(len(X_o)))
prob += lpDot(ones_vec,X_o), 'Minimize Buses'
# Constraints
for i in range(N):
row = list(X[i,:]) + [X_t[i]]
ones_vec = list(np.ones(len(row)))
prob += lpDot(ones_vec, row) == 1, 'Only one destination for ' + str(i)
for j in range(N):
col = list(X[:,j]) + [X_o[j]]
ones_vec = list(np.ones(len(col)))
prob += lpDot(ones_vec,col) == 1, 'Only one source for ' + str(j)
prob.solve()
return X, value(prob.objective)
由于模型中的Nan输入,我最近遇到了类似的问题。我把数据放在一个数据帧中,其中一些单元格不应该被转换成变量来提高性能。然而,在创建目标函数和约束条件时,我注意到了Nan的存在,当我改变它们时,它工作得很好。
请确保没有重复的LpVariable名称,并注意LpVariable名称中有不支持的字符
-+[] ->/
,因为所有这些字符都会自动转换为下划线_
在调用
prob.solve()
之前设置LpSolverDefault.msg = 1
可能有助于将解算器输出打印到控制台。我认为你有重复的LpVariable名称。我也有同样的问题,多亏了levis501's answer我才看到。这里:
X包含一些同名的变量。例如,对于i=0和j=10,得到“X111”;对于i=10和j=0,也得到“X111”。
相关问题 更多 >
编程相关推荐