我想知道是否可以在ampl中使用operator?我有一组变量protected override Freezable CreateInstanceCore()
{
return new ExponentialDoubleAnimation();
}
和一些约束。现在我有一些约束在某些情况下有效。例如,如果x_{1},...,x_{n}
,其中k是整数,则约束A有效。
有什么办法可以放大吗?
换句话说,问题是我想在可行的时期逐层搜索。该层是点x =(x1,...,xn)与向量 1 =(1,1,1,... 1)之间的点积。
如果
x_{1}+...+x_{n}=kn+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。然后,您可以在其他约束条件中使用此变量。如果您只需要处理几个逻辑约束,这种技巧就很方便,但是如果您有很多逻辑约束,那么在您可以使用逻辑约束选项的情况下,效率会更高。