当我运行一个非常简单的问题时,我偶尔会从ipopt
解算器中获得此错误:No such file or directory: '/var/folders/4f/z25gj3_d29b45_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'
现在,真正奇怪的是,当我拿出最后三个约束(即注释掉)时:
# 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])))
然后解算器没有问题。
导致此错误的原因是什么?为什么在删除最后几个约束时它会被解决?
答案 0 :(得分:2)
我很长一段时间没有使用过lib,只是简短的评论:
您的错误表明(在我的解释中)没有找到解决方案(.sol
后缀用于解决方案)。更确切地说:解算器认为没有可行的解决方案(并且不会生成有效的输出文件)。在不检查问题的情况下,添加/删除约束通常会在可行性方面产生这种影响。
关于使用的基本问题是:为什么这个非常正常的状态如此混淆?对我来说似乎是你错误地使用了lib。 在检查解决方案之前,您不应该读出解决方案!您正在使用cm_results = SolverFactory('ipopt').solve(cm)
隐式执行此操作。
但是因为我长时间没有使用它(因为在凸世界中有更好的替代品;但是,ipopt的良好接口很少见),我无法向你展示代码。但我记得在输出阅读之前,官方博客或至少一些关于状态检查的用户论坛/邮件列表中有一些例子!
除此之外:我认为还有一个日志文件,你可以读出来加强我的想法(可能是这样的:“问题是不可行的”在那里;基本上每次都有3个文件:输入,输出,日志)。
答案 1 :(得分:2)
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"
您可以修改此项以处理不同的退出条件。