为啥我在使用 CPLEX 的 Pyomo 中出现不允许的字符错误?

Posted

技术标签:

【中文标题】为啥我在使用 CPLEX 的 Pyomo 中出现不允许的字符错误?【英文标题】:Why am I getting an unallowed character error in Pyomo with CPLEX?为什么我在使用 CPLEX 的 Pyomo 中出现不允许的字符错误? 【发布时间】:2019-06-03 08:59:41 【问题描述】:

我正在尝试将 CPLEX 与一个简单的 Pyomo 示例一起使用:

from pyomo.environ import *
model = ConcreteModel()
model.x = Var( initialize=-1.2, bounds=(-2, 2) )
model.y = Var( initialize= 1.0, bounds=(-2, 2) )
model.obj = Objective(
        expr= (1-model.x)**2 + 100*(model.y-model.x**2),
        sense= minimize )

opt = SolverFactory('cplex')
results = opt.solve(model)
print(results)

当我运行此代码时,我收到以下错误:

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

路径名中唯一的冒号 (:) 在驱动器号之后:

文件名:C:\Users\USERNA~1\AppData\Local\Temp\tmpl8_ty0y5.cplex.log

在 CPLEX.py 中引发了以下错误:

def _validate_file_name(cplex, filename, description):
    """Validate filenames against the set of allowable characters in CPLEX.

    Returns the filename, possibly enclosed in double-quotes, or raises
    a ValueError is unallowable characters are found.

    """
    if filename is None:
        return filename
    matches = _validate_file_name.illegal_characters.search(filename)
    if matches:
        raise ValueError(
            "Unallowed character (%s) found in CPLEX %s file path/name.\n\t"
            "For portability reasons, only [%s] are allowed. Filename: %s"
            % (matches.group(), description,
               _validate_file_name.allowed_characters.replace("\\",''),filename))
    # CPLEX only supports quoting spaces starting in v12.8.
    if ' ' in filename:
        if cplex.version()[:2] >= (12,8):
            filename = '"'+filename+'"'
        else:
            raise ValueError(
                "Space detected in CPLEX %s file path/name\n\t%s\nand "
                "CPLEX older than version 12.8.  Please either upgrade "
                "CPLEX or remove the space from the %s path."
                % (description, filename, description))
    return filename
_validate_file_name.allowed_characters = r"a-zA-Z0-9 \.\-_\%s" % (os.path.sep,)
_validate_file_name.illegal_characters = re.compile(
    '[^%s]' % (_validate_file_name.allowed_characters,))

如果我注释掉日志文件的验证,我会得到解决方案和 LP 文件的相同错误。

我在其他任何地方都没有看到这个错误。谁能帮帮我?

谢谢。

【问题讨论】:

解决方案和 LP 文件可能有类似的验证。如果在您的案例中这些也被注释掉了会怎样? 是的,他们有类似的验证。如果它们都被注释掉,那么稍后会抛出一个不同的错误。但是,我现在没有它可以展示。 【参考方案1】:

这是在 Pyomo 5.6 中引入 CPLEX 界面的一个错误,并在 Pyomo 5.6.1 版本中得到解决。

【讨论】:

【参考方案2】:

最近,我遇到了同样的问题。 根据奇晨的评论,当“如果匹配……”部分被注释掉时,效果很好。感谢@Qi chen。

在 CPLEX.py 中,cmets 输出以下行:

# if matches:
    #raise ValueError(
    #    "Unallowed character (%s) found in CPLEX %s file path/name.\n\t"
    #    "For portability reasons, only [%s] are allowed."
    #    % (matches.group(), description,
    #       _validate_file_name.allowed_characters.replace("\\",'')))
# CPLEX only supports quoting spaces starting in v12.8.

我猜这可能是由日志文件(xxx.CPLEX.log)引起的,其中存在':',如下所示: 'C:\Program Files\IBM\ILOG\CPLEX_Studio128\cplex\bin\x64_win64\CPLEX.exe' 要么 'C:\Program Files\IBM\ILOG\CPLEX_Studio128\cplex\bin\x64_win64\CPLEX.exe'

【讨论】:

以上是关于为啥我在使用 CPLEX 的 Pyomo 中出现不允许的字符错误?的主要内容,如果未能解决你的问题,请参考以下文章

从 Python PYOMO 使用 GAMS/CPLEX

如何用 cplex 热启动 pyomo?

为啥不考虑 cplex 中解决方案数量的限制?

如何在pyomo中访问目标函数值?

CPLEX、Gurobi 和 FICO Xpress 之间的性能差异的解释使用内点法(障碍)没有交叉?

为啥学术版的cplex有规模限制