Lindo Systems

! For Multi-Criteria problem,                          (MCknapScen.lng)
 Generate a set of undominated solutions for various
   scenarios of weight to be applied to each criterion.
There are a number of participants(parties/criteria), each with their
own objective or utility function, we want to
find a solution to a shared problem so that a 
weighted ( by ALPHA( c)) sum of the criteria is maximized;
!  If all the ALPHA weights are > 0, then
   only undominated solutions will be generated, however,
  WARNING:  for a problem with integer variables, this weighted
   objective approach may not generate all undominated solutions,
   even if all possible weightings are tried.
!Keywords: Allocation, Assignment problem, Fair allocation, Goal programming,
     Knapsack, Multi-criteria, Pareto optimal;

SETS:
 CRITERIA: VAL_REC;

 ITEM: WGT, Z; !Each item has a wgt, value, yes/no var;
 CXI( ITEM, CRITERIA) : VALUE;
 SCENE;
 SxC( SCENE, CRITERIA): ALPHA;
ENDSETS
DATA:
! Case 1;
!Case01  
  ITEM       WGT  =
 ANT_REPEL    1     
 SIX_PACK     3    
 BLANKET      4    
 BRATWURST    3    
 BROWNIE      3   
 FRISBEE      1   
 SALAD        5   
 WATMELON    10 ;
! The value of the items to the various 'players',
 based on allocating 100 points to the items;
!Case01   CRITERIA = TOM  DICK JANE;
!Case01   VALUE =    3    9   12   ! ANT_REPEL;
!Case01             14   20    2   ! SIX_PACK;
!Case01              5   11   14   ! BLANKET;
!Case01             13   21   11   ! BRATWURST;
!Case01              6   12   11   ! BROWNIE; 
!Case01             10   19   13   ! FRISBEE;
!Case01              8    2   28   ! SALAD;
!Case01             41    6    9;  ! WATMELON;
!Case01    CAP =  15;
! The weights to try on the various criteria;
!Case01   ALPHA =  0.98  0.01  0.01
                   0.01  0.98  0.01
                   0.01  0.01  0.98
                   0.34  0.33  0.33
                   0.33  0.34  0.33
                   0.33  0.33  0.34;


! Case 2;
!Case02;
  ITEM       WGT =
  ITEM1       15     
  ITEM2       14    
  ITEM3        7    
  ITEM4        8  ;
!Case02;
   CAP =  15;

!Case02; CRITERIA = DICK JANE;
!Case02; VALUE =     70    0 ! ITEM1;
!Case02;              0   70 ! ITEM1;
!Case02;             14   16 ! ITEM3;
!Case02;             16   14;! ITEM1;

! The weights to try on the various criteria.
  Notice that for this case there is an
  undominated, very attractive solution, for
  which no set of weights will generate it;
!Case02;  ALPHA =  0.98  0.01 
                   0.01  0.98
                   0.51  0.49 
                   0.49  0.51
                   0.50  0.50;
ENDDATA

SUBMODEL KnapMod:
   MAX = @SUM( CRITERIA( k): ALPHA( ss, k) * VAL_REC( k));

! Here insert the regular constraints;
    @FOR( CRITERIA( k): ! Value of soln for criterion k;
      VAL_REC( k) = @SUM( ITEM( j): VALUE( j, k)* Z( j));
        );
       @SUM( ITEM(j): WGT(j)*Z(j)) <= CAP;! Wgt constraint;
       @FOR( ITEM(j): @BIN( Z(j)));       ! All vars 0/1;
ENDSUBMODEL

CALC: 
  @SET( "TERSEO", 2);! Turn off default messages; 
  @WRITE(' Soln');
  @FOR( CRITERIA(c):
     @WRITE( @FORMAT( CRITERIA(c),'5s'));
      ); 
  @FOR( ITEM(j): @WRITE( @FORMAT( ITEM( j),'10s')));
  @WRITE( @NEWLINE(1));
! Loop over given scenario weights;
  @FOR( SCENE( s):
    ss = s;
    @SOLVE( KnapMod);
    @WRITE( @FORMAT( ss,'4.0f'),' ');
    @FOR( CRITERIA( c):
     @WRITE( @FORMAT( VAL_REC( c),'5.0f'));
       );
    @FOR( ITEM(j):
     @IFC( Z( j) #GT# .5:   !Either;
        @WRITE('         1');
      @ELSE
        @WRITE('          ');
         );
        ); ! End FOR;
      @WRITE( @NEWLINE( 1));
      );
ENDCALC