summaryrefslogtreecommitdiff
path: root/code/linprog/Employee Scheduling.sce
blob: 5fdce028a3df848f4597c6aaaa123bfc6668a1dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
//Employee Scheduling
//Macrosoft has a 24-hour-a-day, 7-days-a-week toll free hotline that is being set up to answer questions regarding a new product.  The following table summarizes the number of full-time equivalent employees (FTEs) that mustbe on duty in each time block.
//
//Interval    Time    FTEs
//   1        0-4      15
//   2        4-8      10
//   3        8-12     40
//   4        12-16    70
//   5        16-20    40
//   6        20-0     35
//Macrosoft may hire both full-time and part-time employees. The former work 8-hour shifts and the latter work 4-hour shifts; their respective hourly wages are $15.20 and $12.95. Employees may start work only at the beginning of 1 of the 6 intervals.Part-time employees can only answer 5 calls in the time a full-time employee can answer 6 calls.  (i.e., a part-time employee is only 5/6 of a full-time employee.) At least two-thirds of theemployees working at any one time must be full-time employees.Formulate an LP to determine how to staff the hotline at minimum cost. 

// Copyright (C) 2018 - IIT Bombay - FOSSEE
// This file must be used under the terms of the CeCILL.
// This source file is licensed as described in the file COPYING, which
// you should have received as part of this distribution.  The terms
// are also available at
// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
// Author:Debasis Maharana
// Organization: FOSSEE, IIT Bombay
// Email: toolbox@scilab.in
//======================================================================

clc;

Interval = 1:6;
Time = 0:4:20;
FTEs = [15 10 40 70 40 35];
intr = [];
Ninterval = length(Interval);
for i = 1:Ninterval-1
    intr = [intr;strcat([string(Time(i)),'-',string(Time(i+1))])];
end

intr = [intr;strcat([string(Time(i)),'-',string(Time(1))])];

table = [['Interval','Time','Full-time Emp Req'];[string(Interval'),intr,string(FTEs')]];
mprintf('Data received');
disp(table);
input('press enter to proceed');

A1 = zeros(Ninterval,2*Ninterval);b1 = zeros(Ninterval,1);
A2 = zeros(Ninterval,2*Ninterval);b2 = zeros(Ninterval,1);
A1(1,[1 Ninterval Ninterval+1]) = [-1 -1 -5/6]; b1(1) = -15;
A2(1,[1 Ninterval Ninterval+1]) = [-1/3 -1/3 2/3];        
for i = 2:Ninterval
    A1(i,i-1:i) = -1;
    A1(i,Ninterval+i) = -5/6;
    b1(i) = -FTEs(i);

    A2(i,i-1:i)=-1/3;
    A2(+i,Ninterval+i)=2/3;
end
A= [A1;A2];b = [b1;b2];
Cost = [15.20*8*ones(1,Ninterval) 12.95*4*ones(1,Ninterval)]';
lb = zeros(1,2*Ninterval);ub = [];
[xopt,fopt,exitflag,output,lambda] = linprog(Cost,A,b,[],[],lb,ub)

clc
select exitflag
case 0 then
    mprintf('Optimal Solution Found')
    input('Press enter to view results')
    //Display results
    mprintf('Total Cost is %d\n',-fopt);
    table(:,4:5) = [['Full time Emp', 'Part-Time Emp'];[string(xopt(1:6)) string(xopt(7:12))]];
    disp(table);
case 1 then
    mprintf('Primal Infeasible')
case 2 then
    mprintf('Dual Infeasible')
case 3
    mprintf('Maximum Number of Iterations Exceeded. Output may not be optimal')
case 4
    mprintf('Solution Abandoned')
case 5
    mprintf('Primal objective limit reached')
else
    mprintf('Dual objective limit reached')
end