2

我是 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)!

这个问题有点简单。我正在尝试对尽可能多的变量进行分组,以最大化输出并满足所有约束。

你能帮我理解吗?

4

1 回答 1

3

这是您的模型的清理版本:

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 非此即彼约束下的整数编程技巧。我知道这是违反直觉和痛苦的。您偶然发现的-用于不同的目的,并不意味着与变量一起使用。 ifthen

如果您使用的是 CPLEX,则可以非常直观地表达if-约束:then

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

它应该工作;不幸的是,我没有安装 CPLEX,所以我无法对其进行测试。

于 2014-06-29T11:57:11.300 回答