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 Команда делает некоторые дополнительные вещи для вывода результатов в удобочитаемой форме. Основные шаги:

  1. построить модель
  2. позвоните решить (результаты автоматически загружаются)
  3. извлечь решение из модели, используя удобочитаемые имена
  4. распечатать результаты

На шаге 2 "результаты автоматически загружаются" означает, что объект решения, сохраненный в объекте результатов, снимается и загружается в модель. Это приводит к запутанному выводу "количество решений: 0" при печати объекта результатов в сценарии.

Если вы хотите, чтобы Pyomo оставил объект решения на объекте результатов, вы должны передать load_solutions=False к методу решения. Затем, после проверки статусов и проверки, что объект результатов содержит решение (len(results.solution) > 0), вы можете вручную загрузить решение в модель с помощью model.solutions.load_from(results),

Другие вопросы по тегам