Implementing nested sets

Hello all together.

I’m trying to implement the set Mik and Mjk, as you can see in the picture attached.

I already implemented the other sets as follows:
param N;
set mathN := 1..N;
param K;
set mathK := 1..K;

i and j are indices two different elements from set mathN and k is the index for set mathK.

image

Thank you for any advice!

You should define \cal{M} as a collection of AMPL sets, indexed over \cal{N} and \cal{K}. Here is one way to define your objective, which corresponds closely to the mathematical description:

set N;
set K;
set M {N,K};

param c {i in N, j in N, k in K, M[i,k], M[j,k]};
var y {i in N, j in N, k in K, M[i,k], M[j,k]} >= 0;

minimize Z:
  sum {i in N, j in N, k in K, m in M[i,k], n in M[j,k]} c[i,j,k,m,n] * y[i,j,k,m,n];

Set data for this model includes the members of set N and setK, and the members of set M[i,k] for each i in N and k in K. If N and K are sets of consecutive positive integers, then you can instead write

param Nsize integer > 0;
param Ksize integer > 0;

set N = 1..Nsize;
set K = 1..Ksize;

In this case the first two sets are completely defined by just the two data values Nsize and Ksize. In fact, you don’t have to define N and K at all, but can instead write

param Nsize integer > 0;
param Ksize integer > 0;
set M {1..Nsize,1..Ksize};

and similarly for the rest, substituting 1..Nsize and 1..Ksize for N and K, respectively. Your choice among these alternatives will depend on what works best in the rest of the model, and on your personal preferences for the notation.

1 Like