MODEL:
! Enumerate the extreme points                   (EnumrXtrmB.lng)
of a linearly constrained region using K-Best feature of LINGO.
 Assumptions:
   Objective is MIN,
   Constraints are already in equality form,
! Note, the number of extreme points can be large, of the order of
  n!/(m!*(n-m)!), where
  n= number of variables, and m= number of constraints;
! Keywords: Alternative optima,  Corner point, Enumeration, Extreme point, K-Best solutions;

CALC:
  ! Number of desired extreme points.;
  N = 3;
  ! Enable LINGO's K-Best solver to find the N extreme points.;
  @SET( 'KBESTS', N);
ENDCALC

SETS:
 ROW: RHS; 
 COL: OBJ, X, UBX, ZX;
 RXC( ROW, COL): A;
ENDSETS
DATA: ! Case Xueyu; ! It has two alternative optima; ! Names of rows; !CX; ROW = CON1 CON2 CON3 CON4!CX; RHS = -6 4 8 6!CX; COL = X1 X2 SLK1 SLK2 SLK3 SLK4; ! Upper bounds; !CX; UBX= 999 999 999 999 999 999 ; !CX; OBJ = -2 -1 0 0 0 0; ! Constraint coefficients; !CX; A = -3 -2 1 0 0 0 2 -1 0 1 0 0 2 1 0 0 1 0 -1 2 0 0 0 1 ; ! Case 1: Variant of Astro-Cosmo problem. ! It has two alternative optima; ! Max = 15 A + 30 C A <= 60, C <= 50, A + 2 C <= 120, The last three variables in the tableau, cols 3-5, are the slack variables; ! ROW = ALIM CLIM LABOR; ! RHS = 60 50 120; ! Names of columns; ! COL = A__ C__ S_1 S_2 S_3; ! OBJ = -15 -30 0 0 0; ! Upper bounds; ! UBX = 60 50 999 999 999; ! Names of rows; ! Matrix coefficients, including Obj and RHS; ! A = 1 0 1 0 0 0 1 0 1 0 1 2 0 0 1 ; ! Case 2: Variant of extended Astro-Cosmo problem. ! It has two alternative optima; ! Max = 15 A + 30 C + 44 D, A + D <= 60, C + D <= 50, A + 2 C + 3 D <= 120, ! Names of rows; ! ROW = ALIM CLIM LABOR; ! RHS = 60 50 120; ! The last three variables in the tableau, cols 4-6, are the slack variables; ! Names of columns; ! COL= A__ C__ D__ S_1 S_2 S_3 ; ! OBJ= -15 -30 -44 0 0 0 ; ! Upper bounds; ! UBX = 60 50 40 999 999 999; ! Constraint coefficients; ! A = 1 0 1 1 0 0 0 1 1 0 1 0 1 2 3 0 0 1 ; ! Case 3: Example from Dyer and Proll, Math. Programming, vol. 12, 1977; ! It has 10 extreme points; ! ROW= ROW1 ROW2 ROW3 ROW4 ROW5; ! RHS= 5 16 3 17 10; ! COL= X1 X2 X3 X4 X5 X6 X7 X8 ; ! OBJ= 0 0 0 0 0 0 0 0; ! UBX= 99 99 99 99 99 99 99 99; ! Constraint coefficients; ! A = 3 2 -1 1 0 0 0 0 3 2 4 0 1 0 0 0 3 0 -4 0 0 1 0 0 2.25 4 3 0 0 0 1 0 1 2 1 0 0 0 0 1 ; ! Case 4: Example from chapter 6 of Optimization Modeling with LINGO. ! It has two alternative optima; !Find all extreme points with profit contribution >= 9800; ! Names of rows; !C4 ROW= MACH CAP HOURS SHIP PROD1 PROD2 PROD3 PCTARG; !C4 RHS= 35 35 36 600 218 114 111 9800; !C4 COL = B34 B38 B48 B58 B42 B52 SLK1 SLK2 SLK3 SLK4 SLK5 SLK6 SLK7 SLK8; !C4 OBJ= -15.89 -17.89 -16.5 -15.22 -17.5 -16.22 0 0 0 0 0 0 0 0; ! Upper bounds; !C4 UBX= 999 999 999 999 999 999 999 999 999 999 999 999 999 999; ! Constraint coefficients; !C4 A = 0.11111 0.11111 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0.16667 0 0.16667 0 0 1 0 0 0 0 0 0 0 0 0 0.22222 0 0.22222 0 0 1 0 0 0 0 0 1 1 1 1 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 -1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 -1 0 15.89 17.89 16.5 15.22 17.5 16.22 0 0 0 0 0 0 0 -1 ; ENDDATA MIN = OBV; @FREE( OBV); OBV = @SUM( col( j) : OBJ( j)*X( j)); @FOR( ROW( i) : @SUM( col( j) : A(i,j)*X( j)) = RHS(i); ); ! A basic feasible solution will have at most NCON variables > 0, where NCON = number of constraints; ! Add binary variables to enforce this condition; @FOR( COL( j): X( j) <= UBX( j) * ZX( j); @BIN( ZX( j)); ); ! The number of constraints; NCON = @SIZE( ROW); ! In an extreme point (basic) solution, the number of nonzero variables is <= number of constraints; @SUM( COL( j): ZX( j)) = NCON; END