You are on page 1of 3

Documentation

The Present Model:

The model utilised the open source solvers GLPK(GNU Linear Programming Kit) and
CBC(Coin-or branch and cut). There are two models - agent.mod and break.mod with their
respective data files as agent.dat and break.dat. The optimal schedule with minimum
over/under-allocation was output, w.r.t to the following constraints:

1. Underallocation constraint
2. Capacity constraint
3. Operating time constraint
4. Agents working constraint
5. Agents login constraint
6. Agents present constraint
7. Transportation constraint
8. Break constraint
9. Training constraint
10. Agent assignment constraint
11. Break assignment constraint
12. Consecutive week off constraint

Problems Faced:

The major complaints regarding the present model were:

● Huge variance in the over/under allocation amongst different periods.


● Zero allocation of agents in some of the periods.

Solution Approach:

The main approach we took to solve the problem was to reduce the variance amongst the
different. This was expected to automatically prevent the allocation of zero agents in any
given period. We also planned to eventually add a minimum agent allocation constraint
restricting the minimum number of agents in a period, if required.

This was approached in three ways:


(All of the following changes were made in the agent.mod file)

1. Adding a pre-decided cap on the over/under allocation per hour:


We initially tried to bring the over/under allocation as close as possible to a pre-
decided value. This value, based on our observation of the model results compared
to actual optimal schedules, was decided to be 10.

The constraint added was:


hourlevelConstraint{h in PERIOD} : overallocation[h] + underallocation[h] <= 10 +
OverUnderSlack[h];

The slack was added to prevent the model from ending up with an infeasible
solution.
The objective function was changed to minimize the OverUnderSlack as well:
sum{h in PERIOD} (underallocation[h] + overallocation[h] + OverUnderSlack[h]);

2. Adding a dynamically selected cap on the over/under allocation per hour:


Let this cap be denoted by ‘c’, the range of which, again from observation was set:

lowerbound : c >= 3;
upperbound : c <= 9;

The hour-level constraint added was:


overallocation[h] + underallocation[h] <= c + OverUnderSlack[h];

The objective function was changed to minimize the OverUnderSlack as well:


sum{h in PERIOD}(underallocation[h] + overallocation[h] + OverUnderSlack[h]);

a. We further added a minimum number of agents per period contraint as:

minAgentsPresent{h in PERIOD, k in SHIFT} : agentsPresent[k, h] - sum{b in PERIOD}break[k, b, h] -


sum{t in TRAIN}((sum{ts in 0..(trainingHours[t]-1)}training[t,(h-ts) mod
168*P])*trainingStrength[t])
>= 1;

3. Minimizing the absolute difference between the (overallocation +


underallocation) between any two given periods:
Modified objective function:

max sum{i in PERIOD, j in PERIOD}(y1[i,j]+y2[i,j])

Constraint 1:

{i in PERIOD, j in PERIOD}: difference[i,j]=(overallocation[i]+underallocation[i])-(overallocation[j]


+underallocation[j])
Assigns the difference in the over/under-allocation across different periods to a single
variable.

Constraint 2:
{i in PERIOD, j in PERIOD}: y1[i,j]>=difference[i,j];
{i in PERIOD, j in PERIOD}: y2[i,j]>=-difference[i,j];

We’re trying to do a modulus implementation here. y1 and y2 are defined as


positive variables, so that when the value of difference is positive:
y1>=difference & y2>=0
Since the objective function function is minimizing (y1+y2), it’s expected that
y1=difference and y2=0 at the optima.

4. Quadratic Objective Function:


Weights were added to over/under-allocations, proportional to their values, to
avoid the larger values. This was expected to automatically take care of large
variances, by uniformly allocating agents.

*********************

You might also like