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?
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
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. –