AMPL中定义范围之外的变量索引

时间:2015-06-02 06:20:40

标签: variables indexing set linear-programming ampl

不太熟悉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]根本不应该计算在我们的计算中(例如它不应该约束其他变量) )。任何帮助赞赏:)谢谢。

2 个答案:

答案 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是集合的最后一个元素。