Search code examples
variablesindexingsetlinear-programmingampl

Variable indexes outside of defined range in AMPL


Not too familiar with AMPL, but running into some issues with indexes...

Basically, I have some variables defined as such:

var array{i in set};

And I need to do some amount of checking the elements around a given i in some of the constraints:

subject to Constraint{i in set}:
    array[i] + array[i-1] + array[i+1] <= 12;

But obviously array[0] or array[card(set) + 1] don't exist. To add a further issue, I'm trying to model a sort of problem in which array[0] or array[card(set) + 1] just shouldn't be factored into our computation at all (e.g. it shouldn't constrain the other variables). Any help appreciated :) Thanks.


Solution

  • In AMPL, you can create or define your own "sets" for valid indices and use them in your constraints.

    So, in your case, to avoid invalid indices, you can define a set of permissible indices: param inner_i {2..(N-1)} and loop over those when creating the constraints.

    The price we pay is that we have to explicitly take care of the corner cases.

    Here's one way to do it: (Note, I don't have AMPL loaded, so the code is untested.)

    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.
    

    Hope this helps you move forward.