2017-06-19 2 views
0

Je travaille sur un projet qui nécessite que je code avec une librairie python. appelé pyomo.Valeur de réglage d'une variable indexée à une expression indexée - pyomo

et j'ai besoin de définir la valeur d'une variable indexée à une expression indexée.

Il y a donc 2 modèles au total et 1 script qui crée leurs instances.

premier modèle:

m.i = [1,2,3] # i=1,2,3 
m.j = [1,2,3] # j=1,2,3 

m.index = Set(within=m.i*m.j) # m.index = [i]*[j] (pyomo set) 

m.a = Var(m.index) # m.a[i,j] 

m.Exp = Expression(m.index) # pyomo expression with [i,j] index 

m.Const = Constraint(m.index, rule=const_rule) 

def const_rule(m, index): 
    return m.a[index] == m.Exp[index] 

Deuxième modèle:

m.index = ...   # same index with first model's m.index 
m.y = Var(m.index) # lets assume it has values or I can put with init command 

le script run.py:

instance1 = create_first_model() 
instance2 = create_second model() 

solve(instance2) 

for k in instance1.index:          
    instance1.Exp[k].expr = instance2.y[k].value 

solve(instance1) 

Peu de temps:

je besoin d'une meilleure approche pour cette pour-boucle. ou approche plus efficaces (les boucles sont lentes ...)

Cordialement Okan

Ps: tous les vars, ensembles, l'expression et la contrainte sont des objets pyomo.

Répondre

0

Ex. M.Exp est-elle une expression contenant des variables Pyomo ou utilisez-vous une constante (c'est-à-dire un paramètre mutable)?

Si l'on suppose qu'il est une expression et que vous voulez ajouter une contrainte en fonction de l'expression dans votre boucle for, ce qui suit devrait fonctionner:

def _linking_con(m, k): 
    return m.Exp[k] == value(instance2.y[k]) 
instance1.linking_con = Constraint(instance1.index, rule=_linking_con) 

Si m.Exp est une valeur constante alors je serais le remplacer par un mutable Param

m.Exp = Param(m.index, mutable=True) 

puis changez pour en boucle à:

for k in instance1.index: 
    instance1.Exp[k] = value(instance2.y[k]) 

Je ne pense pas qu'il existe un moyen d'éviter la boucle for

+0

Je l'utilise comme paramètre mutuel, mais je ne l'ai pas codé comme ça parce que sinon le solveur ne donne aucune variable double de cette contrainte. – Icedkk

+0

Aussi, si je mets _linking_con à l'intérieur d'un modèle, ils ne fonctionneront pas parce que les instances ne sont pas créées avant d'appeler les modèles et donc il donnera une erreur en appelant des modèles qui seront comme instance2.y [k] n'existe pas. – Icedkk

+0

Vous pouvez ajouter la contrainte après la construction des deux modèles –