Lindo Systems

 
MODEL:
! Find all the alternate optimal solutions (2 in this case)
  to a linear program;
! Keywords: Alternative optima, Corner points, Enumeration, Extreme point, 
  K-Best solutions, Multi-criteria, Multiple optima, Simplex method;

! The linear program;
SUBMODEL MYLP:

[R_OBJ] !MAX = 6*X1   +   4*X2 ; ! True objective; 
         MIN = X3;  ! Constant objective gives
                      all feasible corner points;
                X1   +   4*X2  <=  40 ;
              3*X1   +   2*X2  <=  30 ;
              3*X1   +     X2  <=  24 ;

ENDSUBMODEL

PROCEDURE REPORT:
    ! Give a brief report on current solution;
   @WRITE( @NEWLINE( 1));
   @WRITE( ' Soln ', ITER, ', Objective = ', R_OBJ, 
    ', X1, X2 = ', X1, ' ', X2,
   );
ENDPROCEDURE

CALC:
   ! Suppress all output except errors;
   @SET( 'TERSEO', 2);

   ! Solve the original model;
   @SOLVE( MYLP);

   ! Suppress final infeasible error;
   @SET( 'TERSEO', 3);

   ! While we continue to have an optimal solution, 
     solve for next alternate optimal solution;
   ITER = 0;
   @WHILE( @STATUS() #EQ# 0:

      ! Write current soln summary;
      ITER = ITER + 1;
      REPORT;

      ! Get next alternate optimal soln;
      @NEXTALTOPT();
   );

   ! Fall through here when no further alternate
     optimal solutions exist;
   @IFC( @STATUS() #EQ# 1:
      @WRITE( @NEWLINE( 2), 
       ' All Done! No further alt solns found.');
   @ELSE
      @WRITE( @NEWLINE( 2), 
       ' *** Error solving model ***');
   );
 
ENDCALC

END