Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么;没有这样的文件或目录;在pyomo中使用ipopt解算器时?_Python_Python 2.7_Ampl_Pyomo - Fatal编程技术网

Python 为什么;没有这样的文件或目录;在pyomo中使用ipopt解算器时?

Python 为什么;没有这样的文件或目录;在pyomo中使用ipopt解算器时?,python,python-2.7,ampl,pyomo,Python,Python 2.7,Ampl,Pyomo,当我运行一个非常简单的问题时,我偶尔会从ipopt解算器中得到这个错误:没有这样的文件或目录:'/var/folders/4f/z25gj3\u d29b45\u 2nx87p8rvr0000gn/T/tmpwMeEAK.pyomo.sol'。这一次我看到了,我真的想弄明白为什么会这样 这是我的模型,具有非常基本的约束条件和目标函数: cm=ConcreteModel() a = Var([1,2], [0,1,2,3], domain=Reals) b = Var([1,2], [0,1,2

当我运行一个非常简单的问题时,我偶尔会从
ipopt
解算器中得到这个错误:
没有这样的文件或目录:'/var/folders/4f/z25gj3\u d29b45\u 2nx87p8rvr0000gn/T/tmpwMeEAK.pyomo.sol'
。这一次我看到了,我真的想弄明白为什么会这样

这是我的模型,具有非常基本的约束条件和目标函数:

cm=ConcreteModel()

a = Var([1,2], [0,1,2,3], domain=Reals)
b = Var([1,2], [0,1,2,3], domain=Reals)
c = Var([0,1,2,3], domain=Reals)

cm.q = a
cm.p = b
cm.u = c

cm.end_a_1 = Constraint(expr=(a[1,3] == 1.0))
cm.end_b_2 = Constraint(expr=(b[2,3] == 0.0))
cm.end_a_2 = Constraint(expr=(a[2,3] == 1.0))
cm.start_a_2 = Constraint(expr=(a[2,0] == 0.0))
cm.start_a_1 = Constraint(expr=(a[1,0] == 1.0))
cm.start_b_2 = Constraint(expr=(b[2,0] == -11.0))
cm.start_b_1 = Constraint(expr=(b[1,0] == -11.0))
cm.end_b_1 = Constraint(expr=(b[1,3] == 0.0))
cm.constr_a_1_1 = Constraint(expr=a[1,2] == a[1,1] + a[2,1])
cm.constr_a_1_0 = Constraint(expr=a[1,1] == a[1,0] + a[2,0])
cm.constr_b_1_0 = Constraint(expr=(b[1,1] == (b[1,0] + -(b[2,0]))))
cm.constr_b_1_1 = Constraint(expr=(b[1,2] == (b[1,1] + -(b[2,1]))))
cm.constr_b_1_2 = Constraint(expr=(b[1,3] == (b[1,2] + -(b[2,2]))))
cm.constr_b_2_2 = Constraint(expr=(b[2,3] == (b[2,2] + -(b[1,2]))))
cm.constr_b_2_1 = Constraint(expr=(b[2,2] == (b[2,1] + -(b[1,1]))))
cm.constr_b_2_0 = Constraint(expr=(b[2,1] == (b[2,0] + -(b[1,0]))))
cm.constr_a_2_2 = Constraint(expr=(a[2,3] == (a[2,2] + a[1,2])))
cm.constr_a_2_0 = Constraint(expr=(a[2,1] == (a[2,0] + a[1,0])))
cm.constr_a_2_1 = Constraint(expr=(a[2,2] == (a[2,1] + a[1,1])))
cm.constr_a_1_2 = Constraint(expr=(a[1,3] == (a[1,2] + a[2,2])))

oe=c[0]
o = Objective(expr=oe)
cm.objective=o
cm_results = SolverFactory('ipopt').solve(cm)
当然,当我解决上述问题时,我会得到一个回溯:

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pyomo/opt/plugins/sol.pyc in __call__(self, filename, res, soln, suffixes)
     44         """
     45         try:
---> 46             with open(filename,"r") as f:
     47                 return self._load(f, res, soln, suffixes)
     48         except ValueError as e:

IOError: [Errno 2] No such file or directory: '/var/folders/4f/z25gj3_d29b45_2nx87p8rvr0000gn/T/tmpwMeEAK.pyomo.sol'
现在,真正奇怪的是,当我去掉最后三个约束(即注释掉):

那么解算器就没有问题了


是什么导致了这个错误?当最后的几个约束被移除时,为什么它会得到解决呢?

我很久没有使用这个库了,但有一句简短的评论:

您的错误(在我的解释中)表明未找到解决方案(解决方案使用
.sol
后缀)。更准确地说:解算器认为没有可行的解决方案(并且不会生成有效的输出文件)。在不检查问题的情况下,添加/删除约束通常会对可行性产生这种影响

关于用法的基本问题是:为什么这个相当正常的状态如此模糊?在我看来,你使用lib是错误的在检查是否有解决方案之前,您不应该读出解决方案您正在使用
cm\u results=SolverFactory('ipopt').solve(cm)
隐式执行此操作。 但由于我很长时间没有使用它(因为在凸面世界中有更好的替代方案;但是是的,ipopt的好接口很少见),我无法向您展示代码。但我记得在官方博客或至少一些用户论坛/邮件列表中有一些关于输出阅读前状态检查的例子


除此之外:我认为还有一个日志文件,您可以读出它来强化我的想法(可能类似于:“问题不可行”;基本上每次都涉及3个文件:输入、输出、日志)

我很长一段时间没有使用这个lib,只是说了一句简短的话:

您的错误(在我的解释中)表明未找到解决方案(解决方案使用
.sol
后缀)。更准确地说:解算器认为没有可行的解决方案(并且不会生成有效的输出文件)。在不检查问题的情况下,添加/删除约束通常会对可行性产生这种影响

关于用法的基本问题是:为什么这个相当正常的状态如此模糊?在我看来,你使用lib是错误的在检查是否有解决方案之前,您不应该读出解决方案您正在使用
cm\u results=SolverFactory('ipopt').solve(cm)
隐式执行此操作。 但由于我很长时间没有使用它(因为在凸面世界中有更好的替代方案;但是是的,ipopt的好接口很少见),我无法向您展示代码。但我记得在官方博客或至少一些用户论坛/邮件列表中有一些关于输出阅读前状态检查的例子


除此之外:我认为还有一个日志文件,您可以读出它来强化我的想法(可能类似于:“问题不可行”;基本上每次都涉及3个文件:输入、输出、日志)

这种从Ipopt退出表示在求解过程中存在内部错误(可能与可行性无关)。Pyomo(5.2)的最新版本已经过更新,以更好地处理这种情况。如果将
tee=True
添加到
solve()
调用中,它将流式传输Ipopt输出,您应该可以获得更多信息

此外,在使用解决方案之前,应始终检查解决状态。当我懒惰时,我通常会做如下事情:

ipopt = SolverFactory("ipopt")
result = ipopt.solve(model)
assert str(result.solver.status) == "ok"
assert str(result.solver.termination_condition) == "optimal"

您可以对此进行修改以处理不同的退出条件。

这种从Ipopt退出的方式表明在求解过程中存在内部错误(可能与可行性无关)。Pyomo(5.2)的最新版本已经过更新,以更好地处理这种情况。如果将
tee=True
添加到
solve()
调用中,它将流式传输Ipopt输出,您应该可以获得更多信息

此外,在使用解决方案之前,应始终检查解决状态。当我懒惰时,我通常会做如下事情:

ipopt = SolverFactory("ipopt")
result = ipopt.solve(model)
assert str(result.solver.status) == "ok"
assert str(result.solver.termination_condition) == "optimal"

您可以修改此选项以处理不同的退出条件。

好的,我会尝试。非常奇怪的是,
pyomo
会有这样一个内部错误……这可能是一个bug。python中是否有其他的解算器可以避免类似的事情?这不是Pyomo中的内部错误。这发生在Pyomo将模型发送到的外部解算器中。对于Ipopt,通常情况下,这与初始起点不好或迭代有关,其中解算器尝试在函数不可微的点(例如sqrt(0))计算函数的导数。通常有很多方法可以对此进行建模。有很多其他的解算器可以与Pyomo进行交互,你只需要在你的机器上安装它们。看起来您的模型是线性的,所以GLPK将是一个选项(免费)。你只需要确保glpsol可执行文件在你的路径中(看起来你已经为Ipopt做了)。我解决的问题是控制理论,它们通常是非线性的。通常目标函数是哈密顿函数,或某种类型的多项式。你会推荐什么解决方案?pyomo的新版本(
5.2.1
)似乎对此没有帮助。我只是做了我建议你做的事情(add tee=True),Ipopt打印了一条非常清晰的错误消息。你的问题自由度太少(等式约束比变量多)。好的,我试试看。非常奇怪,
pyomo
会有这样一个内部