Pyomo(GLPK,Windows)在 'results.yml' 内向我展示了奇怪的结果

Pyomo (GLPK, Windows) shows me weird results within 'results.yml'

使用 Pyomo 5.1.1(Windows 7 上的 CPython 2.7.10),我正在尝试执行最简单的 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'都会改变,但是内容总是一样的

这是由于 LP 文件格式的一个怪癖。具体来说,一些求解器不允许 objective 中的常数项。为了解决这个问题,Pyomo 自动添加一个普通变量(名为 ONE_VAR_CONSTANT)和一个强制它为 1(字面意思,ONE_VAR_CONSTANT == 1)的约束到所有以 LP 文件格式输出的模型。这通常不会影响求解器性能,因为求解器具有预求解步骤,可在求解之前从模型中移除变量和约束。

另外,请注意您在摘要中看到的结果是正确的:您的模型的最佳解决方案是:

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

and 可以通过将答案代入约束和 objective 来验证(约束有效且满足,并且 objective 低于您的手算值 0.75)。