2017-09-11 4 views
1

d'abord, voici un exemple simple qui illustre mon problème:AMPL erreur de syntaxe - contrainte sur ensemble indexé

# .mod file 
param N; 
set TIME := 1 .. N; 
set C ordered; 
param tbar {C}; 
var X {C,TIME} >= 0; 

minimize cost: sum {c in C} X[c,N]; 

subject to C1 {c in C: ord(c)>1, t in 1 .. N-1}: 
    X[c,t+1] = X[c,t] + 3; 

Voici le fichier .dat:

param N := 10; 
set C := C1 C2 C3; 
param tbar := 
    C1 2 
    C2 3 
    C3 3 ; 

Je reçois l'erreur de syntaxe

test.mod, line 9 (offset 142): 
    syntax error 
context: subject to C1 {c in C: >>> ord(c)>1, <<< t in 1 .. N-1}: 

Si je change la position de l'indexation à

{t in 1 .. N-1, c in C: ord(c)>1}, 

cela fonctionne très bien. Le problème est, que je veux avoir

{c in C: ord(c)>1, t in tbar[c] .. N-1}, 

donc je ne peux pas changer la position. Est-ce que quelqu'un sait pourquoi cette erreur se produit et s'il y a un moyen de contourner le problème?

+0

J'ai trouvé la solution. la condition doit être à la fin: {c en C, t en tbar [c] .. N-1: ord (c)> 1} fonctionne. – ops

+0

Une autre option ici est de l'exprimer sans condition. Quelque chose comme {c in (C diff {premier (C)}), t dans tbar [c] .. N-1} devrait fonctionner. Dans cet exemple, la version que vous choisissez n'a probablement pas beaucoup d'importance, mais pour les ensembles d'index volumineux, il peut être plus efficace d'éliminer ces cas immédiatement plutôt que de les générer et de les supprimer à nouveau via la condition. –

Répondre

0

Comme vous l'avez découvert déjà, l'état doit être à la fin de l'expression d'indexation:

subject to C1 {c in C, t in 1 .. N-1: ord(c)>1}: 
    X[c,t+1] = X[c,t] + 3; 

Si vous souhaitez utiliser c comme un indice dans une expression plus tard, comme tbar[c] et il est non définie pour c = first(C) alors vous pouvez faire

{c in (C diff {first(C)}), t in tbar[c] .. N-1} 

comme suggéré par Geoffrey Brent.