2017-11-03 12 views
1

그래서 내 인생에서 pyomo 프로그램을 실행할 수 없습니다. 이 하나에서 다른 종류의지도 것들, 당신을 어떻게 작동하는지에 대한 이해에서비어있는 모델 pyomo

set warehouses := warehouseone warehousetwo warehousethree warehousefour; 
set stores := storeone storetwo storethree storefour storefive storesix; 

param cost: 
           storeone storetwo storethree storefour storefive storesix := 
    warehouseone    23  12 34  25  27 16  
    warehousetwo    29  24 43  35  28 19  
    warehousethree    43  31 52  36  30 21  
    warehousefour    54  36 54  46  34 27; 



param m := 4 ; 
param n := 6 ; 

param: a:= 
warehouseone 15 
warehousetwo 25 
warehousethree 40 
warehousefour 70; 


param: b := 
warehouseone 10 
warehousetwo 5 
warehousethree 7 
warehousefour 4; 


param: d := 
storeone  45 
storetwo  120 
storethree 165 
storefour 214 
storefive 64 
storesix  93; 

:

from pyomo.environ import * 
#pyomo solve --solver=glpk diet.py diet.dat 
model = AbstractModel() 

# Foodss 

model.m = Param(within=NonNegativeIntegers) 
model.n = Param(within=NonNegativeIntegers) 

model.warehouses = RangeSet(1, model.m) 
model.stores = RangeSet(1, model.n) 




model.cost = Param(model.warehouses,model.stores) 
model.a = Param(model.warehouses) 
model.b = Param(model.warehouses) 
model.d = Param(model.stores) 
model.amounts = Var(model.warehouses, model.stores, within = NonNegativeIntegers) 
model.pprint() 






# Minimize the cost of food that is consumed 
def cost_rule(model): 
    return sum(
     model.cost[n,i] * model.amounts[n,i] 
     for n in model.warehouses 
     for i in model.stores 
    ) 
model.cost = Objective(rule=cost_rule) 

def minDemandRule(store, model): 
    return sum(model.a[i]*model.amounts[i, store] for i in model.warehouses) >= model.d[store] 
model.demandConstraint = Constraint(model.stores, rule=minDemandRule) 
# Limit the volume of food consumed 
def maxSupplyRule(warehouse,model): 
    return sum(model.amounts[warehouses,j] for j in model.stores) <= self.b[warehouse] 
model.supplyConstraint = Constraint(model.warehouses, rule=maxSupplyRule) 

플러스의 .dat 파일 :

나는 내 파이썬 파일이 있습니다. 이것은 나에게 좋은 것처럼 보이지만 내가 그것을 실행할 때. DAT 파일이 제대로 읽을되지 않는 것처럼

pyomo solve --solver=glpk transport.py data.dat 

[ 0.00] Setting up Pyomo environment 
[ 0.00] Applying Pyomo preprocessing actions 
2 Set Declarations 
    amounts_index : Dim=0, Dimen=2, Size=0, Domain=None, Ordered=True, Bounds=None 
     Virtual 
    cost_index : Dim=0, Dimen=2, Size=0, Domain=None, Ordered=True, Bounds=None 
     Virtual 

2 RangeSet Declarations 
    stores : Dim=0, Dimen=1, Size=0, Domain=None, Ordered=True, Bounds=None 
     Not constructed 
    warehouses : Dim=0, Dimen=1, Size=0, Domain=None, Ordered=True, Bounds=None 
     Not constructed 

6 Param Declarations 
    a : Size=0, Index=warehouses, Domain=Any, Default=None, Mutable=False 
     Not constructed 
    b : Size=0, Index=warehouses, Domain=Any, Default=None, Mutable=False 
     Not constructed 
    cost : Size=0, Index=cost_index, Domain=Any, Default=None, Mutable=False 
     Not constructed 
    d : Size=0, Index=stores, Domain=Any, Default=None, Mutable=False 
     Not constructed 
    m : Size=1, Index=None, Domain=NonNegativeIntegers, Default=None, Mutable=False 
     Not constructed 
    n : Size=1, Index=None, Domain=NonNegativeIntegers, Default=None, Mutable=False 
     Not constructed 

1 Var Declarations 
    amounts : Size=0, Index=amounts_index 
     Not constructed 

11 Declarations: m n warehouses stores cost_index cost a b d amounts_index amounts 
WARNING: Implicitly replacing the Component attribute cost (type=<class 'pyomo.core.base.param.IndexedParam'>) on block unknown with a new Component (type=<class 'pyomo.core.base.objective.SimpleObjective'>). 
    This is usually indicative of a modelling error. 
    To avoid this warning, use block.del_component() and block.add_component(). 
[ 0.01] Creating model 
ERROR: Constructing component 'a' from data={'warehousefour': 70, 'warehouseone': 15, 'warehousethree': 40, 'warehousetwo': 25} failed: 
    RuntimeError: Failed to set value for param=a, index=warehousefour, value=70. 
     source error message="Error setting parameter value: Index 'warehousefour' is not valid for array Param 'a'" 
[ 0.02] Pyomo Finished 
ERROR: Unexpected exception while running model: 
    Failed to set value for param=a, index=warehousefour, value=70. 
     source error message="Error setting parameter value: Index 'warehousefour' is not valid for array Param 'a'" 

는 느낌,하지만 난 다른 예를 볼 때,이 그것을 수행하는 방법, 그래서 조금 당황 해요.

답변

1

잘못된 pyomo 사용에 대한 오타에서 몇 가지 문제가있었습니다. 아래는 고정 버전입니다. 그것이 당신을 위해 일하고 더 구체적인 질문이있는 경우, 그것에 대한 새로운 질문을 게시하십시오.

파일 diet.py :

from pyomo.environ import * 
#pyomo solve --solver=glpk diet.py diet.dat 
model = AbstractModel() 

# Foodss 

model.warehouses = Set() 
model.stores = Set() 


model.a = Param(model.warehouses) 
model.b = Param(model.warehouses) 
model.d = Param(model.stores) 
model.cost = Param(model.warehouses, model.stores) 
model.amounts = Var(model.warehouses, model.stores, within = NonNegativeIntegers) 
model.pprint() 


# Minimize the cost of food that is consumed 
def cost_rule(model): 
    return sum(
     model.cost[n,i] * model.amounts[n,i] 
     for n in model.warehouses 
     for i in model.stores 
    ) 
model.costObjective = Objective(rule=cost_rule) 

def minDemandRule(model, store): 
    return sum(model.a[i]*model.amounts[i, store] for i in model.warehouses) >= model.d[store] 
model.demandConstraint = Constraint(model.stores, rule=minDemandRule) 

# Limit the volume of food consumed 
def maxSupplyRule(model, warehouse): 
    return sum(model.amounts[warehouse,j] for j in model.stores) <= model.b[warehouse] 
model.supplyConstraint = Constraint(model.warehouses, rule=maxSupplyRule) 

파일 diet.dat :

param: warehouses: 
       a b := 
    warehouseone 15 10 
    warehousetwo 25 5 
    warehousethree 40 7 
    warehousefour 70 4; 


param: stores: 
       d := 
    storeone  45 
    storetwo  120 
    storethree 165 
    storefour 214 
    storefive 64 
    storesix  93; 


param cost: 
           storeone storetwo storethree storefour storefive storesix := 
    warehouseone     23  12 34  25  27 16 
    warehousetwo     29  24 43  35  28 19 
    warehousethree    43  31 52  36  30 21 
    warehousefour    54  36 54  46  34 27; 

예 실행 (I 원금을 솔버 여기 CLP를 사용하는 것이 아니라,하고주의) :

$ pyomo solve --solver=clp test.py test.dat 
[ 0.00] Setting up Pyomo environment 
[ 0.00] Applying Pyomo preprocessing actions 
4 Set Declarations 
    amounts_index : Dim=0, Dimen=2, Size=0, Domain=None, Ordered=False, Bounds=None 
     Virtual 
    cost_index : Dim=0, Dimen=2, Size=0, Domain=None, Ordered=False, Bounds=None 
     Virtual 
    stores : Dim=0, Dimen=1, Size=0, Domain=None, Ordered=False, Bounds=None 
     Not constructed 
    warehouses : Dim=0, Dimen=1, Size=0, Domain=None, Ordered=False, Bounds=None 
     Not constructed 

4 Param Declarations 
    a : Size=0, Index=warehouses, Domain=Any, Default=None, Mutable=False 
     Not constructed 
    b : Size=0, Index=warehouses, Domain=Any, Default=None, Mutable=False 
     Not constructed 
    cost : Size=0, Index=cost_index, Domain=Any, Default=None, Mutable=False 
     Not constructed 
    d : Size=0, Index=stores, Domain=Any, Default=None, Mutable=False 
     Not constructed 

1 Var Declarations 
    amounts : Size=0, Index=amounts_index 
     Not constructed 

9 Declarations: warehouses stores a b d cost_index cost amounts_index amounts 
[ 0.00] Creating model 
[ 0.02] Applying solver 
[ 0.03] Processing results 
    Number of solutions: 1 
    Solution Information 
     Gap: None 
     Status: optimal 
     Function Value: 532.113571429 
    Solver results file: results.json 
[ 0.04] Applying Pyomo postprocessing actions 
[ 0.04] Pyomo Finished 
$ 
+0

안녕 Timofey, 자세한 답변을 보내 주셔서 감사합니다. 코드를 살펴보면 내가 실수 한 곳을 알 수 있습니다. 단지 호기심이 생겼습니다. 왜냐하면 변수 파일이 솔루션 파일에보고되지 않는다면 새로운 것이기 때문에 동일하다고 가정합니다. 지도와 도움을 주셔서 감사합니다. – Eigenvalue

+0

@Eigenvalue 예, 솔루션에 표시되지 않은 변수는 항상 0으로 가정합니다. –