2015-03-18 51 views
1

我正在使用pyomo包實現優化問題。我正在嘗試pyomo在線文檔中提供的示例問題之一。但是,當我試圖解決它時,我遇到了錯誤。Pyomo輸出錯誤

使用的Python代碼:

from __future__ import division 
from pyomo.environ import * 

model = AbstractModel() 

model.Nodes = Set() 
model.Arcs = Set(dimen=2) 

model.Flow = Var(model.Arcs, domain=NonNegativeReals) 
model.FlowCost = Param(model.Arcs) 
model.Demand = Param(model.Nodes) 
model.Supply = Param(model.Nodes) 

def Obj_rule(model): 
    return summation(model.FlowCost, model.Flow) 

model.Obj = Objective(rule=Obj_rule, sense=minimize) 


def FlowBalance_rule(model, node): 
    return model.Supply[node] \ 
     + sum(model.Flow[i, node] for i in model.Nodes if (i,node) in model.Arcs) \ 
     - model.Demand[node] \ 
     - sum(model.Flow[node, j] for j in model.Nodes if (j,node) in model.Arcs) \ 
     == 0 

model.FlowBalance = Constraint(model.Nodes, rule=FlowBalance_rule) 

而且,數據文件是:

set Nodes := CityA CityB CityC ; 
set Arcs := 
CityA CityB 
CityA CityC 
CityC CityB 
; 
param : FlowCost := 
CityA CityB 1.4 
CityA CityC 2.7 
CityC CityB 1.6 
; 
param Demand := 
CityA 0 
CityB 1 
CityC 1 
; 
param Supply := 
CityA 2 
CityB 0 
CityC 0 
; 

當我嘗試解決這個問題,我收到以下錯誤。

[ 0.00] Setting up Pyomo environment 
[ 0.00] Applying Pyomo preprocessing actions 
[ 0.01] Creating model 
ERROR: Rule failed when generating expression for constraint FlowBalance with index CityB: 
     KeyError: "Error accessing indexed component: Index '('CityB', 'CityC')' is not valid for array component 'Flow'" 
ERROR: Constructing component 'FlowBalance' from data=None failed: 
     KeyError: "Error accessing indexed component: Index '('CityB', 'CityC')' is not valid for array component 'Flow'" 
ERROR: Unexpected exception while running model test.py: 
     Error accessing indexed component: Index '('CityB', 'CityC')' is not valid for array component 'Flow' 

回答

1

你有FlowBalance_rule

sum(model.Flow[node, j] for j in model.Nodes if (j,node) in model.Arcs) 

以下錯字,其中索引model.Flow[node,j]和條件if (j,node) in model.Arcs導致該錯誤。

我假設你想翻轉有條件的元組的順序,以下工作

def FlowBalance_rule(model, node): 
    return model.Supply[node] \ 
     + sum(model.Flow[i, node] for i in model.Nodes if (i,node) in model.Arcs) \ 
     - model.Demand[node] \ 
     - sum(model.Flow[node, j] for j in model.Nodes if (node,j) in model.Arcs) \ 
     == 0