Pyomo Solvers в Анаконде (результаты, отличные от командной строки)
Я запускаю пример rosenbrock.py со страницы 64 документа PDF по адресу https://www.osti.gov/servlets/purl/1376827`, который похож на pyomo_examples\doc\pyomobook\nonlinear-ch\rosen
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)**2,sense=minimize)
Я использую Anaconda с Python 3.6 под Windows 10 64-bit, и у меня установлены GLPK и IPOPT в пути (IPOPT является частью установки SolverStudio). Я могу запустить пример из командной строки и получить следующий сокращенный результат:
>pyomo solve rosen.py --solver=ipopt --summary
Number of solutions: 1
Solution Information
Gap: None
Status: optimal
Function Value: 2.9895642187051186e-17
Solution Summary
Variables:
x : Value: 0.9999999945428673
y : Value: 0.9999999890517721
Objectives: Value: 2.9895642187051186e-17
Constraints: None
Если я затем запусту эту же модель в IPython/Anaconda, используя SolverFacotry:
opt = SolverFactory("ipopt", executable=
"E:\\SolverStudio\\SolverStudio\\Solvers\\64bit\\ipopt.exe")
results = opt.solve(model)
print(results)
Я получаю результат с "Условие завершения: оптимальное", но решение говорит "количество решений: 0".
Problem:
Lower bound: -inf
Upper bound: inf
Number of objectives: 1
Number of constraints: 0
Number of variables: 2
Sense: unknown
Solver:
Status: ok
Message: Ipopt 3.12.1\x3a Optimal Solution Found
Termination condition: optimal
Id: 0
Error rc: 0
Time: 0.5311787128448486
Solution:
number of solutions: 0
number of solutions displayed: 0
Результат говорит о том, что проблема не ограничена, а смысл неизвестен. Могу ли я использовать ту же модель в Pythan, которую я использую из командной строки, или мне нужно как-то ее изменить? Я хотел бы использовать один и тот же скрипт Python как для командной строки, так и для IPython/Anaconda.
1 ответ
pyomo
Команда делает некоторые дополнительные вещи для вывода результатов в удобочитаемой форме. Основные шаги:
- построить модель
- позвоните решить (результаты автоматически загружаются)
- извлечь решение из модели, используя удобочитаемые имена
- распечатать результаты
На шаге 2 "результаты автоматически загружаются" означает, что объект решения, сохраненный в объекте результатов, снимается и загружается в модель. Это приводит к запутанному выводу "количество решений: 0" при печати объекта результатов в сценарии.
Если вы хотите, чтобы Pyomo оставил объект решения на объекте результатов, вы должны передать load_solutions=False
к методу решения. Затем, после проверки статусов и проверки, что объект результатов содержит решение (len(results.solution) > 0
), вы можете вручную загрузить решение в модель с помощью model.solutions.load_from(results)
,