2017-05-05 118 views
0

我试图创建Pyomo 5.1.1抽象模型实例化一个具体的模型,然后使用Python内的值来填充它(即不使用AMPL文件)。我基本上遵循Pyomo documentation example,但我得到“恒定客观检测”。从抽象pyomo模型

import pyomo.environ as oe 
model = oe.AbstractModel() 
model.I = oe.Set() 
model.J = oe.Set() 
model.a = oe.Param(model.I,model.J) 
model.b = oe.Param(model.I) 
model.c = oe.Param(model.J) 
model.x = oe.Var(model.J,domain=oe.NonNegativeReals) 
def obj_expression(model): 
    return oe.summation(model.c,model.x) 

model.OBJ = oe.Objective(rule=obj_expression) 
def ax_constraint_rule(model,i): 
    return sum(model.a[i,j]*model.x[j] for j in model.J) >= model.b[i] 

model.AxbConstraint = oe.Constraint(model.I,rule=ax_constraint_rule) 

然后,我尝试初始化这个模型与实际值

aa = np.array([[1,2,1,4],[5,2,2,4]]) 
bb = np.array([2,4]) 
cc = np.array([1,2,4,2]) 

cmodel = model.create_instance() 
cmodel.a.values = aa 
cmodel.b.values = bb 
cmodel.c.values = cc 

opt = oe.SolverFactory("glpk") 
results = opt.solve(cmodel) 

我收到以下错误:

WARNING:pyomo.core:Constant objective detected, replacing with a placeholder to prevent solver failure. WARNING:pyomo.core:Empty constraint block written in LP format - solver may error WARNING: Constant objective detected, replacing with a placeholder to prevent solver failure. WARNING: Empty constraint block written in LP format - solver may error

显然有什么东西错在我的方式初始化cmodel但我找不到描述蟒蛇内初始化的任何文件。

回答

1

如果你不需要从AMPL加载数据.dat文件,我建议从ConcreteModel开始。在这种情况下,除非需要它们是可变的,否则不需要将数据存储到Param对象中。仍然建议为索引组件创建Set对象;否则,Set对象将被隐式创建,其名称可能与您添加到模型中的组件冲突。

通过将您ConcreteModel定义,数据作为输入,你基本上是通过复制和AbstractModelcreate_instance方法提供的功能函数内。例如,

import pyomo.environ as oe 

def build_model(a, b, c): 
    m = len(b) 
    n = len(c) 
    model = oe.ConcreteModel() 
    model.I = oe.Set(initialize=range(m)) 
    model.J = oe.Set(initialize=range(n)) 
    model.x = oe.Var(model.J,domain=oe.NonNegativeReals) 

    model.OBJ = oe.Objective(expr= oe.summation(c,model.x)) 
    def ax_constraint_rule(model,i): 
     arow = a[i] 
     return sum(arow[j]*model.x[j] for j in model.J) >= b[i] 
    model.AxbConstraint = oe.Constraint(model.I,rule=ax_constraint_rule) 
    return model 

# Note that there is no need to call create_instance on a ConcreteModel 
m = build_model(...) 
opt = oe.SolverFactory("glpk") 
results = opt.solve(m) 

而且,最好是用它们来构建Pyomo表达式之前先转换所有numpy的阵列使用array.tolist()方法Python列表。 Pyomo还没有内置到其表达系统阵列操作的概念,以及使用numpy的阵列使用的是它们可以比仅仅使用Python列表慢的方式。