使用复合求解器在求解方法中解析日志文件参数的文件路径



我正在使用pyomo 5.7.3和cplex 12.9。

我正在从pyomo的SolverFactory调用solve方法,并使用下面的代码记录到文件'model.log'(工作正常(。

optimizer = SolverFactory('cplex')
results = optimizer.solve(
model,
warmstart = True,
tee = True,
logfile = "cplex.log",
)

但如果我将日志文件更改为'./runs/cplex.log',则会引发一个错误:

ValueError:在CPLEX日志文件路径/名称中发现不允许的字符(/(。出于可移植性的原因,只允许使用[a-zA-Z0-9~:.-_]。

有没有办法将文件夹的路径解析到日志文件参数中/在不引发错误的情况下运行?

此外,是否可以使用日志记录包中的记录器并将cplex日志输出到此记录器?

谢谢你,


EDIT:以天真的方式解决(代码如下(。有更好的方法吗?

initial_dir = os.getcwd()
os.chdir(run_dir) #changing to log dir in order to avoid providing unallowed characters to lgofile argument in solve method
results = optimizer.solve(
model,
warmstart = True,
tee = True,
logfile = f'{model_name}_cplex_log.log',
)
os.chdir(initial_dir) # returning to former directory

由于您使用的是pyomo 5.7.3,因此方法应该是:

import os
log_folder = os.path.join(".","runs")
from pyomo.common.tempfiles import TempfileManager
TempfileManager.tempdir = log_folder

如果文件夹不存在,请不要忘记创建该文件夹。

PS:我在Pyomo中为solver函数写了一个小包装器,它会自动完成这项工作,如果你想检查它,还可以在求解后对所有变量进行后处理,尽管日志文件夹的名称是"_log";在我的案例中,日志文件根据模型名称按文件夹分组,然后按日期和时间命名。

最新更新