如何在放大器中使用if条件?

时间:2019-01-24 15:53:46

标签: linear-programming cplex ampl

我想知道是否可以在ampl中使用operator?我有一组变量protected override Freezable CreateInstanceCore() { return new ExponentialDoubleAnimation(); } 和一些约束。现在我有一些约束在某些情况下有效。例如,如果x_{1},...,x_{n},其中k是整数,则约束A有效。 有什么办法可以放大吗?

换句话说,问题是我想在可行的时期逐层搜索。该层是点x =(x1,...,xn)与向量 1 =(1,1,1,... 1)之间的点积。

如果 1 > = 1,则x必须满足约束A <1, 如果= 2,则x必须满足约束B <2, 。 。 。 这是我在AMPL网站上找到的,但是它不起作用! (n是x和k的任意整数的维数)

x_{1}+...+x_{n}=kn+1

1 个答案:

答案 0 :(得分:1)

我不清楚您的示例是否表示“约束A要求x_[1]+...+x_[n]=4m+1其中m是整数”,还是“如果x_[1]+...+x_[n]=4m+1其中m是整数,则约束A需要满足其他一些条件。”

前者编写代码很简单:

var m integer;
s.t. c1: sum{i in 1..n} x_[i] = 4m+1;

它确实需要具有MIP功能的求解器。从您的标签中,我假设您正在使用CPLEX,这应该没问题。

对于后者:AMPL确实支持逻辑约束,here已记录。根据您的问题,有时也可以将逻辑约束编码为线性整数约束。

例如,如果示例中的x[i]变量也是整数,则可以这样设置:

var m integer;
var r1 integer in 0..1;
var r2 integer in 0..2;
s.t. c1: r2 <= 2*r1; # i.e. r2 can only be non-zero if r1 = 1
s.t. c2: sum{i in 1..n} x_[i] = 4m+r1+r2;
var remainder_is_1 binary;
s.t. c3: remainder_is_1 >= r1-r2;
s.t. c4: remainder_is_1 <= 1-r2/2;

这些约束共同确保remainder_is_1等于且仅当sum{i in 1..n} x_[i] = 4m+1等于某个整数m时等于1。然后,您可以在其他约束条件中使用此变量。如果您只需要处理几个逻辑约束,这种技巧就很方便,但是如果您有很多逻辑约束,那么在您可以使用逻辑约束选项的情况下,效率会更高。