Lindo Systems

! Find Kth largest of a set.
  Given a set of values, X( I),
 Find THETA = Kth largest value in a set of values X( I).
 Also, compute sum of K largest.
   The X( I) may be variables, they need not be constants.
 Only the upper and lower bounds, XU and XL, must be known constants;
! Keywords: Median, P median, Sorting;
SETS:
  SERIES: X, XS, Z;
ENDSETS
DATA:
  N = 3000; ! Length of series;
  K = 20;   ! Desired K median;
  SERIES = 1..N;
!   Just for illustration purposes,
  Generate a quasi-random series
  with arbitrary starting seed;
  X = @QRAND(9387145);
  XL = 0; ! Lower bound for X( i);
  XU = 1; ! Upper bound for X( i);
ENDDATA;
@FOR( SERIES( I):
   @BIN( Z( I)); ! Z(I) = 1 if X(I) is one of K largest;
! If Z( I) = 1 then X( I) >= THETA;
    X( I) >= THETA - ( XU - XL)*(1- Z( I));
! If Z( I) = 0: X( I) <= THETA;
    X( I) <= THETA + ( XU - XL)* Z( I);

! If want to know the sum of the X(I) >= THETA;
   @FREE( XS( I));  ! In case L or U < 0;
! If Z( i) = 1 then XS( I) = X( I);
    XS( I) >= X( I) - XU*(1 - Z( I));
    XS( I) <= X( i) - XL*(1 - Z( I));
! If Z( I) = 0 then XS( I) = 0;
    XS( I) <= XU* Z( I);
    XS( I) >= XL* Z( I);
    );

! How many we can select;
  @SUM( SERIES( I): Z( I)) = K;

! Sum of K largest;
   SUMTOPK = @SUM( SERIES( I): XS( I));