Python 纸浆解算器错误
我正在尝试在纸浆(Python)中解决MILP问题,并不断出现以下错误:Python 纸浆解算器错误,python,pulp,coin-or-cbc,Python,Pulp,Coin Or Cbc,我正在尝试在纸浆(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
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
请确保没有重复的LpVariable名称,并注意LpVariable名称中包含不支持的字符
-+[]->/
,因为所有这些字符都会自动转换为下划线。
调用
prob.solve()
之前设置LpSolverDefault.msg=1
可能有助于将解算器输出打印到控制台。我遇到了一些类似的问题,这是由于一些纸浆的缺陷造成的。当某个问题不可行且解算器未能解决该问题时,将引发异常,而不是返回状态等于不可行。原因如下
(您可能首先想查看最新的纸浆代码库,因为您粘贴的行号与最新的行号不匹配。我将根据最新的行号进行解释,但您可以非常简单地查看您的行号。)
这是异常提示的地方
if not os.path.exists(tmpSol):
raise PulpSolverError("Pulp: Error while executing "+self.path)
tmpSol是存储解决方案的临时文件。如果PuLP找不到这样的解决方案文件,它将抛出您看到的异常。我上面提到的错误是,如果问题本身是不可行的,那么纸浆将无法生成这样的临时文件。所以它总是抛出这样的异常
您可以做的一件事是,向pull repo发送请求并修复它。
一个简单的解决方法是,而不是直接调用
prob.solve()
在代码中,您应该始终这样做
try:
prob.solve()
except Exception:
logger.debug('Problem infeasible')
我在启动LPSolver类的多个实例时遇到了相同的问题。如fmars所述,问题在于路径“tmpSol”不存在,该路径在Palm的solvers.py文件中的以下代码行中定义:
pid = os.getpid()
tmpLp = os.path.join(self.tmpDir, "%d-pulp.lp" % pid)
tmpMps = os.path.join(self.tmpDir, "%d-pulp.mps" % pid)
tmpSol = os.path.join(self.tmpDir, "%d-pulp.sol" % pid)
这段代码出现在每个解算器中。问题是这些路径稍后会被删除,但对于LPSolver类的不同实例可能会重合(因为变量pid不是唯一的)
解决方案是使用例如当前时间为LPSolver的每个实例获取唯一路径。用以下四行替换上面的行就可以了
currentTime = time()
tmpLp = os.path.join(self.tmpDir, "%f3-pulp.lp" % currentTime)
tmpMps = os.path.join(self.tmpDir, "%f3-pulp.mps" % currentTime)
tmpSol = os.path.join(self.tmpDir, "%f3-pulp.sol" % currentTime)
别忘了
from time import time
干杯,
Tim由于模型中的Nan输入,我最近遇到了类似的问题。我将数据放在一个数据框中,其中一些单元格不应转换为变量以提高性能。但是,在创建目标函数和约束条件时,我注意到Nan的存在,当我更改它们时,它工作得非常好。我今天遇到了这个问题,这是因为CBC的临时文件试图写入路径中有空格的位置,而Palm传递给subprocess.Popen()的命令运行CBC时不使用引号,因此该命令被误解,CBC无法找到创建临时文件的位置 为此,我找到了两种解决方案: (1) 显式设置一个没有空格的临时文件目录
pulp.LpSolverDefault.tmpDir = self.tmp_file_dir # tmp_file_dir can't have spaces!
prob.solve()
或
(2) 不要使用CBC(我的问题很小)
我有一个与工作相关的限制,即我的很多工作都停留在有空格的目录中 我认为您有重复的变量名。我也有同样的问题,多亏了你。在这里:
X包含一些同名的变量。例如,对于i=0和j=10,您会得到“X111”,对于i=10和j=0,您也会得到“X111”。我有一个类似的问题,事实上,对于重复的LpVariable名称,就像levis501的答案和aleon的答案一样 我的代码是:
var = [[pulp.LpVariable(f'x{i}{j}', lowBound=0, cat=pulp.LpInteger) for j in range(col)] for i in range(row)]
当i=1 j=11时,x将是x111,当i=11 j=1时,x也将是x111
我改为:
var = [[pulp.LpVariable(f'x{i}_{j}', lowBound=0, cat=pulp.LpInteger) for j in range(col)] for i in range(row)]
更改后,它成功运行。我最近也遇到了同样的错误。在我的案例中引发此错误代码的原因是我的数据帧没有正确填充。在我的一些限制条件下,我在RHS上错误地设置了
NaN
它是这样的:
Matrix=df.pivot(第一维度、第二维度、值)
此操作会自动为不在原始数据帧中的实例放入NaN
在我的例子中,NaN的
被替换为0
,这正是我所期望的:
Matrix=Matrix.fillna(0)
纸浆语法看起来不错。我没有写出完整的公式,所以我要仔细检查一下。这个问题可以解决吗?你的数据集有多大?我会尝试在一个非常小的数据集上求解。如果它不起作用,我会认为你的公式有问题。快速侧注,你不必使用带有一个向量的lpDot,你可以使用lpSumOn再看一眼你所做的X=np.array(X)
。这可能会搞乱一些事情。假设任何解决失败都是因为不可行。大多数时候,试图解决一个不可行的问题不会导致例外;调用prob.solve()后,它只会导致一个状态为不可行的问题:prob.status==-1。为什么这个错误只适用于一些不可行的情况?一些不可行的公式从未触发此错误,只是返回状态0。解决了我的问题。请回答这个问题我遇到了相同的问题,我相信你的答案是正确的。但是,我不明白您所说的“问题是这些路径稍后会被删除,但对于LPSolver类的不同实例可能会重合(因为变量pid不是唯一的)。”为什么这个错误只适用于一些罕见的情况?某些不可行的公式从不触发此错误,只返回状态0。
X = [[LpVariable('X' + str(i+1) + str(j+1), 0, C[i,j],LpBinary)
for j in range(N)] for i in range(N)]
var = [[pulp.LpVariable(f'x{i}{j}', lowBound=0, cat=pulp.LpInteger) for j in range(col)] for i in range(row)]
var = [[pulp.LpVariable(f'x{i}_{j}', lowBound=0, cat=pulp.LpInteger) for j in range(col)] for i in range(row)]