Оптимизацията в AMPL връща грешен резултат

Нов съм в AMPL „Език за математическо програмиране“. Опитвам се да реша някои уравнения, но открих, че отговорът не е логически правилен (или доколкото разбирам!). Така че моят код е следният (след като открих проблема, трябваше да го опростя, за да го разбера):

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;

Резултатът е следният:

output = 1
x = 1
y = 0
z = 0

но ако съм прав, максималният изход трябва да бъде 2 (когато x = 0, y = 1, z = 1).

Сега, ако сменя реда на деклариране на променливи:

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;

тогава изходът става 3 (x=y=z=1) и ограничението (ако x = 1, тогава (y+z) = 0) не е изпълнено!

Проблемът е някак прост. Опитвам се да групирам възможно най-много променливи, за да максимизирам резултата и да отговоря на всички ограничения.

Можете ли да ми помогнете да го разбера?


person user3787524    schedule 29.06.2014    source източник


Отговори (1)


Ето изчистената версия на вашия модел:

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;

Това отпечатва:

output = 2
x = 0
y = 1
z = 1

Предположих, че поне x е двоична променлива, в противен случай вашият модел няма смисъл за мен. Също така забележете начина, по който изразих границите на променливите точно в декларацията, а не като отделни ограничения.

Проблемът с вашия оригинален модел е, че AMPL е език за моделиране, а не език за програмиране: трябва да изразите if - then по различен начин, както в езиците за програмиране. Вижте Трикове за целочислено програмиране, под 7.3 Или-или ограничения< /em>. Знам, че е контраинтуитивно и болезнено. if - then, на които попаднахте, служат за различна цел и не са предназначени да се използват с променливи.

Ако използвате CPLEX, можете да изразите if-then ограничения доста интуитивно:

disable: x = 1  ==>  y + z = 0;

Трябва да работи; за съжаление, нямам инсталиран CPLEX, така че не мога да го тествам.

person Ali    schedule 29.06.2014
comment
Мерси човече. Това беше отлично обяснение. Имам cplex и го пробвах .. Работи :D - person user3787524; 29.06.2014
comment
Страхотно, радвам се, че помогна! Ако това реши проблема ви, моля, обмислете приемането на моя отговор. Приемане на отговори: Как работи? - person Ali; 29.06.2014
comment
@user3787524 Да? Какъв би бил вашият въпрос? - person Ali; 29.06.2014
comment
ако искам да минимизирам броя на групите .. как ще бъде кодът? в предишния пример искам резултатът да бъде 2 (това означава 2 групи, първата съдържа x, а втората съдържа y и z) - person user3787524; 29.06.2014
comment
@user3787524 За съжаление не разбирам, но изглежда е друг въпрос. Моля, напишете въпроса си с код и обяснение и го публикувайте като нов въпрос. Не се притеснявай, ще го видя. - person Ali; 29.06.2014
comment
Благодаря!! Ще следвам някои техники за оцветяване на графики. Мисля, че може да реши проблема. - person user3787524; 29.06.2014