Optimiziation in AMPL returns wrong result

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?

Answers


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.


Need Your Help

create a vCalendar appointment using java mail without an email appearing in Outlook inbox

java email outlook

I'm using Java Mail to create a vCalendar to add appointments to individual's Outlook Calendar. This is resulting in an appointment appearing in the inbox with the accept, decline etc buttons.

Need to create http webserver using Qt 4.7 in C++

c++ http qt4 webserver

I need to create a http web server which responds to http clients using Qt 4.7