Lindo Systems

! Assignment model.
 We have a set of tasks to be performed, and
a set of operators, each of whom can do one task, and
a COST(i,j) of having task i done by operator j.
We want to find an assignment of tasks to operators that
minimizes total cost.
 The Assignment problem is a special case of the Transportation problem;
! Keywords: Assignment, Task Assignment;
SETS:
   TASK ;
   OPERATOR;
   LINK( TASK, OPERATOR): COST, X;
ENDSETS
! Here are the data;
DATA:
 ! The names of the tasks;
 TASK = T1 T2 T3 T4 T5 T6;
 !  The traditional assignment problem has 
   number of operators = number of tasks, 
   but that is not crucial.
 The names of the operators.;
 OPERATOR= P1 P2 P3 P4 P5 P6 P7 P8;
 ! The cost of assigning operator j (column)
   to task i (row);
   COST = 6 2 6 7 4 2 5 9
          4 9 5 3 8 5 8 2
          5 2 1 9 7 4 3 3
          7 6 7 3 9 2 7 1
          2 3 9 5 7 2 6 5
          5 5 2 2 8 1 4 3;
  ! Data can be retrieved from a spreadsheet with 
    statements like TASK = @OLE( );
  ! if a) the appropriate spreadsheet is open in Excel, and
       b) there is an appropriate range named TASK in the spreadsheet;
ENDDATA

SUBMODEL ASSIGN:
! Minimize the cost of the assignment;
   MIN = TCOST;
     TCOST = @SUM( LINK( i, j): 
       COST( i, j) * X( i, j));

! Each operator can do at most one task;
   @FOR( OPERATOR( j): 
    @SUM( TASK( i): X( i, j)) <= 1;
        );

! Each task must be done;
   @FOR( TASK( i): 
    @SUM( OPERATOR( j): X( i, j)) = 1;
        );
 ENDSUBMODEL

 CALC:
  @SET('TERSEO', 2); ! Ask for Terse output, (0 = default);
  @SOLVE( ASSIGN);
  @WRITE('A Task Assignment Problem.',@NEWLINE(1));
  @WRITE(' The assignments are:',@NEWLINE(1), '      Task    Operator   Cost', @NEWLINE(1));
  @FOR( LINK(i,j) | X(i,j) #GT# 0.5:
    @WRITE('       ',TASK(i),'        ', OPERATOR(j),'       ',COST(i,j),@NEWLINE(1));
      );
  @WRITE(' Cost of the assignment= ', TCOST, @NEWLINE(1));
 ENDCALC