2017-03-27 2 views
0

J'ai le type de contrainte suivante:Constraint qui appelle à l'ancien membre de jeu

def C_rule(model,t-1): 
    return x[t]<=y[t-1] 

model.C=Constraint(model.t,rule=C_rule) 

Mais mettre model.t éléments sont de type chaîne, donc je ne peux pas accéder à l'élément précédent de cette façon. Y a-t-il un moyen de faire cela?

Répondre

0

Si vous déclarez votre ensemble à commander alors vous pouvez faire quelque chose comme ceci:

m.s = Set(initialize=['A','B','C'], ordered=True) 
m.v = Var(m.s) 

def _c_rule(m, i): 
    if i == 'A': 
     return Constraint.Skip 
    return m.v[i] <= m.v[m.s.prev(i)] 
m.c = Constraint(m.s, rule=_c_rule) 

# Or the opposite way 
def _c2_rule(m, i): 
    if i == 'C': 
     return Constraint.Skip 
    return m.v[m.s.next(i)] <= m.v[i] 
m.c2 = Constraint(m.s, rule=_c2_rule) 
+0

Cela renvoie: 'A: (1000,) B: v [B] <= v [A] C: v [C] <= v [B] 'mais je veux' A: v [B] <= v [A] B: v [C] <= v [B] C: Aucun' – iriniapid

+0

I ' J'ai mis à jour la réponse pour inclure ce que vous voulez. Voir la contrainte 'c2' –