不太熟悉AMPL,但遇到索引的一些问题......
基本上,我有一些变量定义如下:
var array{i in set};
在某些约束中,我需要对给定i
周围的元素进行一些检查:
subject to Constraint{i in set}:
array[i] + array[i-1] + array[i+1] <= 12;
但显然array[0]
或array[card(set) + 1]
不存在。为了增加一个问题,我试图模拟一种问题,其中array[0]
或array[card(set) + 1]
根本不应该计算在我们的计算中(例如它不应该约束其他变量) )。任何帮助赞赏:)谢谢。
答案 0 :(得分:0)
在AMPL中,您可以创建或定义自己的&#34;套装&#34;对于有效的索引,并在约束中使用它们。
因此,在您的情况下,为了避免无效索引,您可以定义一组允许的索引:param inner_i {2..(N-1)}
并在创建约束时循环遍历这些索引。
我们支付的价格是我们必须明确处理角落案件。
以下是一种方法:(注意,我没有加载AMPL,因此代码未经测试。)
param N > 0; #number of elements
set ELEM; # Elements
set inner_i {2..(N-1)} > 0; #valid indices
var array {ELEM} >= 0;
subject to LimitSum{i in inner_i}:
array[i-1] + array[i] + array[i+1] <= 12;
#Take care of the boundary conditions explicitly, if needed
subject to LimitSum_start:
array[1] + array[2] <= 12;
#only two elements since array[0] doesn't exist.
subject to LimitSum_last:
array[N-1] + array[N] <= 12;
#only two elements since array[N+1] doesn't exist.
希望这有助于你前进。
答案 1 :(得分:0)
您可以使用if-then-else表达式有条件地包含一些术语:
subject to Constraint{i in set}:
array[i] + (if i != 0 then array[i-1]) + (if i != N then array[i+1]) <= 12;
其中N
是集合的最后一个元素。