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
然而,我发现以下结果。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文件格式中的一个怪癖造成的。具体而言,某些解算器不允许目标中存在常量项。为了解决这个问题,Pyomo自动向以LP文件格式输出的所有模型中添加了一个普通变量(名为ONE_VAR_CONSTANT
)和一个强制它为1的约束(字面意思是,ONE_VAR_CONSTANT==1
)。这通常不会影响解算器性能,因为解算器具有预解算步骤,这些步骤将在解算之前从模型中移除变量和约束。
此外,请注意,您在摘要中看到的结果是正确的:您的模型的最佳解决方案是:
x[1]=0.3333333
x[2]=0
OBJ=0.666666
并且可以通过将答案代入约束和目标来验证(约束是主动且满足的,目标低于你手算的值0.75)。