Reputation: 155
I'm new to AMPL "A Mathematical Programming Language". I'm trying to solve some equations but I found out that the answer is not logically correct (or as far as I understand!). So my code is the following (after I found out the problem, I had to simplify it to understand it):
option solver minos;
var x;
var y;
var z;
maximize output: x+y+z;
subject to x_lim: 0<=x<=1;
subject to y_lim: 0<=y<=1;
subject to z_lim: 0<=z<=1;
subject to disable: if x = 1 then (y+z) = 0;
solve;
display output,x,y,z;
The output is the following:
output = 1
x = 1
y = 0
z = 0
but if I'm right, the maximum output must be 2 (when x = 0, y = 1, z = 1).
Now, if I switch the variables declaration order :
var y;
var x;
var z;
maximize output: x+y+z;
subject to x_lim: 0<=x<=1;
subject to y_lim: 0<=y<=1;
subject to z_lim: 0<=z<=1;
subject to disable: if x = 1 then (y+ z) = 0;
solve;
display output,x,y,z;
then the output becomes 3 (x=y=z=1) and the constraint (if x = 1 then (y+z) = 0) is not met!
The problem is somehow simple. I'm trying to group as much variables as I can to maximize the output and meet all the constraints as well.
Can you please help me understand it?
Upvotes: 2
Views: 204
Reputation: 58501
Here is the cleaned-up version of your model:
var x binary;
var y >= 0, <= 1;
var z >= 0, <= 1;
maximize output: x + y + z;
disable: y + z <= 2*(1-x);
solve;
display output, x, y, z;
This prints:
output = 2
x = 0
y = 1
z = 1
I assumed that at least x
is a binary variable, otherwise your model makes little sense to me.
Also notice the way I expressed variable bounds right at the declaration and not as separate constraints.
The problem with your original model is that AMPL is a modeling language and not a programming language: You have to express if
- then
differently as in programming languages. See Integer Programming Tricks, under 7.3 Either-or constraints. I know it is counterintuitive and painful. The if
- then
you stumbled into serve a different purpose and are not meant to be used with variables.
If you are using CPLEX, you can express if
-then
constraints quite intuitively:
disable: x = 1 ==> y + z = 0;
It should work; unfortunately, I don't have CPLEX installed so I cannot test it.
Upvotes: 3