Python 纸浆解算器错误

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

我正在尝试在纸浆(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

请确保没有重复的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)]