Pyomo (GLPK, Windows) показывает мне странные результаты в файле «results.yml»

Работая с Pyomo 5.1.1 (CPython 2.7.10 в Windows 7), я пытаюсь выполнить самый простой пример Pyomo, конкретную модель, показанную по адресу https://software.sandia.gov/downloads/pub./pyomo/PyomoOnlineDocs.html#_a_simple_concrete_pyomo_model

from __future__ import division
from pyomo.environ import *
model = ConcreteModel()
model.x = Var([1,2], domain=NonNegativeReals)
model.OBJ = Objective(expr = 2*model.x[1] + 3*model.x[2])
model.Constraint1 = Constraint(expr = 3*model.x[1] + 4*model.x[2] >= 1)

Я выполняю:

> pyomo solve Pyomo_concrete_v1.py --solver=glpk

По моим собственным расчетам, результаты должны быть:

x[1]=0
x[2]=0.25
OBJ=0.75

Однако я нахожу следующие «results.yml»:

# ----------------------------------------------------------
#   Problem Information
# ----------------------------------------------------------
Problem: 
- Name: unknown
  Lower bound: 0.666666666667
  Upper bound: 0.666666666667
  Number of objectives: 1
  Number of constraints: 2
  Number of variables: 3
  Number of nonzeros: 3
  Sense: minimize
# ----------------------------------------------------------
#   Solver Information
# ----------------------------------------------------------
Solver: 
- Status: ok
  Termination condition: optimal
  Statistics: 
    Branch and bound: 
      Number of bounded subproblems: 0
      Number of created subproblems: 0
  Error rc: 0
  Time: 0.018000125885
# ----------------------------------------------------------
#   Solution Information
# ----------------------------------------------------------
Solution: 
- number of solutions: 1
  number of solutions displayed: 1
- Gap: 0.0
  Status: feasible
  Message: None
  Objective:
    OBJ:
      Value: 0.666666666667
  Variable:
    x[1]:
      Value: 0.333333333333
  Constraint: No values

Я не понимаю, почему есть "2 ограничения" (на самом деле есть только одно ограничение), "3 переменных" (на самом деле, 2), а результат - вектор размера 1.

Этот файл «results.yml» меняется каждый раз, когда я запускаю «pyomo», но содержимое всегда остается одним и тем же.


person Hookstark    schedule 30.03.2017    source источник


Ответы (1)


Это связано с особенностью формата файла LP. В частности, некоторые решатели не допускают постоянных условий в цели. Чтобы обойти это, Pyomo автоматически добавляет тривиальную переменную (с именем ONE_VAR_CONSTANT) и ограничение, которое устанавливает ее в 1 (буквально, ONE_VAR_CONSTANT == 1) для всех моделей, выводимых в формате файла LP. Как правило, это не влияет на производительность решателя, так как решатели имеют предварительные шаги, которые удаляют переменную и ограничение из модели перед ее решением.

Также обратите внимание, что результаты, которые вы видите в сводке, верны: оптимальное решение для вашей модели:

x[1]=0.3333333
x[2]=0
OBJ=0.666666

и его можно проверить, подставив ответ в ограничение и цель (ограничение активно и удовлетворено, а цель ниже рассчитанного вручную значения 0,75).

person jsiirola    schedule 30.03.2017
comment
Большое спасибо, jsiirola. Я добавил второе ограничение, чтобы избежать того, что x[2] равен нулю, и, по сути, Pyomo показывает значение x[2] в результатах (и три ограничения тоже). - person Hookstark; 31.03.2017