Constraint problem (if then else?)

24 views
Skip to first unread message

Sam

unread,
May 22, 2016, 6:24:30 AM5/22/16
to AMPL Modeling Language
Hello,

I need to modelise a problem and I have an issue with one contraint:

s.t. notsameliquid {i in liquide, j in reservoir}:
if (i!=lqIni[j]) then (y[i,j] 0) else (y [i,j] <= cap [j] - quantIni [j]);

I get the error: dimanche.mod:63: right parenthesis missing where expected

I can't figure out what the issue is.


/*Structure logique*/

#Objets que vont parcourir les indices

param nl ;
set liquide :={1..nl} ; #Numérotation liquide
param nres ;
set reservoir :={1..nres} ; #Numérotation réservoir

#Paramètres

param qantIni {j in reservoir} >= 0 ; #quantité initiale de liquide dans réservoir j 
param cap  {j in reservoir} >=0 ; #capacité du réservoir j 
param approv {i in liquide}>=0 ; #fourniture en liquide
param lqIni {j in reservoir} >=0, <=nl ; #type de liquide initial dans réservoir 


#Variables 

var q {i in liquide} >= 0; #quantités restantes a mettre dans réservoirs lorsqu'on a utilisé les capacité résiduelle des reservoirs possédant un liquide initial

var x {i in liquide, j in reservoir:qantIni[j]=0 }, binary ; #après remplissage prioritaire la variable vaut 1 si un liquide i est présent    dans réservoir j, 0 si réservoir j est vide.  

var y {i in liquide, j in reservoir}  >= 0 ; #quantité de liquide i de l’approvisionnement mis dans reservoir j 

#J’ai rajouté la variable “q”, il est dans les consignes 

#Fonction objectif

minimize capacite_libre: #minimisation somme capacité de réservoirs remplis 
sum {j in reservoir, i in liquide:qantIni[j]=0} cap [j] * x [i,j] ; 



/*Contraintes*/


s.t. capacite {i in liquide}: # garantit que l’ensemble des réservoirs recevant du liquide i offrent une capacité totale suffisante
sum {j in reservoir:qantIni[j]=0} cap [j]*x[i,j] >= q[i];


s.t. compatibilite {j in reservoir}: # assure que chaque réservoir libre ne reçoit pas plus d’une sorte de liquide
sum {i in liquide:qantIni[j]=0} x[i,j] <= 1  ; 

s.t. approvisionnement {i in liquide}: #contrainte bilan approvisionnement
sum {j in reservoir} y[i,j] = approv[i];
s.t. notsameliquid {i in liquide, j in reservoir}:
if (i!=lqIni[j]) then (y[i,j] 0) else (y [i,j] <= cap [j] - quantIni [j]); 


Thanks for your help

Robert Fourer

unread,
May 22, 2016, 11:23:20 AM5/22/16
to am...@googlegroups.com
An if-then-else is an expression in AMPL; thus it doesn't work to write "if <condition> then <constraint> else <constraint>". Instead you should use the "implies" operator ==> like this:

s.t. notsameliquid {i in liquide, j in reservoir}:
i!=lqIni[j] ==> y[i,j] = 0 else y[i,j] <= cap [j] - quantIni[j];

Alternatively, break this into two constraints for the two cases:

s.t. notsameliquid1 {i in liquide, j in reservoir: i!=lqIni[j]}:
y[i,j] = 0;

s.t. notsameliquid2 {i in liquide, j in reservoir: i=lqIni[j]}:
y[i,j] <= cap [j] - quantIni[j];

Bob Fourer
am...@googlegroups.com

=======

From: am...@googlegroups.com [mailto:am...@googlegroups.com] On Behalf Of Sam
Sent: Sunday, May 22, 2016 5:24 AM
To: AMPL Modeling Language
Subject: [AMPL 11993] Constraint problem (if then else?)

I need to modelise a problem and I have an issue with one contraint:

s.t. notsameliquid {i in liquide, j in reservoir}:
if (i!=lqIni[j]) then (y[i,j] 0) else (y [i,j] <= cap [j] - quantIni [j]);

I get the error: dimanche.mod:63: right parenthesis missing where expected

I can't figure out what the issue is.


/*Structure logique*/

#Objets que vont parcourir les indices

param nl ;
set liquide :={1..nl} ; #Numérotation liquide
param nres ;
set reservoir :={1..nres} ; #Numérotation réservoir

#Paramètres

param qantIni {j in reservoir} >= 0 ; #quantité initiale de liquide dans réservoir j
param cap {j in reservoir} >=0 ; #capacité du réservoir j
param approv {i in liquide}>=0 ; #fourniture en liquide
param lqIni {j in reservoir} >=0, <=nl ; #type de liquide initial dans réservoir

...

Sam

unread,
May 22, 2016, 7:24:59 PM5/22/16
to AMPL Modeling Language, 4...@ampl.com
Thank you for your quick answer. We were able to run the problem and found an optimal solution.
I would like to show you another issue if you don't mind:

We are having other problems with the printf display command

for {j  in reservoir}{
printf {i in liquide: x[i,j]=1} 
"%3d, de liquide %3d, mis dans reservoir %3d\n",cap[j]-capacite[i]-qantIni[j],i,j;}

we get a first line but then dimanchenuit.mod:117: x[1,2] out of domain (Model postsolving error)

Our variable:

var x {i in liquide, j in reservoir:qantIni[j]=0 }, binary ;

and quantIni[2]=100

I assume the problem comes from there.

We also use cap[j]-capacite[i]-qantIni[j] instead of y[i,j] because it gives us 0 insted of a value for the first line.

Thank you for your help.
Sam



param nl ;

set liquide :={1..nl} ;

param nres ;

set reservoir :={1..nres} ;


param qantIni {j in reservoir} >= 0 ;

param cap  {j in reservoir} >=0 ;

param approv {i in liquide}>=0 ;

param lqIni {j in reservoir} >=0, <=nl ;


var q {i in liquide} >= approv[i] - sum{j in reservoir : lqIni[j] = i}(cap[j] - qantIni[j]);

var x {i in liquide, j in reservoir:qantIni[j]=0 }, binary ;

var y {i in liquide, j in reservoir} >= 0;


minimize capacite_libre:

sum {j in reservoir, i in liquide:qantIni[j]=0} cap [j] * x [i,j] ;


s.t. capacite {i in liquide}:

sum {j in reservoir :qantIni[j]=0} cap [j]*x[i,j] >= q[i];


s.t. compatibilite {j in reservoir}:

sum {i in liquide:qantIni[j]=0} x[i,j] <=1  ;


s.t. approvisionnement {i in liquide}:

sum {j in reservoir} y [i,j]<=approv[i];


s.t. notsameliquid1 {i in liquide, j in reservoir: i!=lqIni[j]}:

     y[i,j] = 0;


s.t. notsameliquid2 {i in liquide, j in reservoir: i=lqIni[j]}:

     y[i,j] <= cap [j] - qantIni[j];


s.t. reservoir_vide{i in liquide, j in reservoir:qantIni[j]=0}:

y[i,j] <= cap[j]*x[i,j];

Sam

unread,
May 23, 2016, 6:41:22 AM5/23/16
to AMPL Modeling Language, 4...@ampl.com
We found the issue, we were missing a constraint.


On Sunday, May 22, 2016 at 5:23:20 PM UTC+2, Robert Fourer wrote:
Reply all
Reply to author
Forward
0 new messages