Assigning Personnel to Machines

Contents

Problem description

An operator needs to be assigned to each of the six machines in a workshop. Six workers have been pre-selected. Everyone has undergone a test of her productivity on every machine. The table below lists the productivities in pieces per hour. The machines run in parallel, that is, the total productivity of the workshop is the sum of the productivities of the people assigned to the machines.

Productivity in pieces per hour

+-------+-----------------+
|       |    Machines     |
+-------+--+--+--+--+--+--+
|Workers| 1| 2| 3| 4| 5| 6|
+-------+--+--+--+--+--+--+
|   1   |13|24|31|19|40|29|
|   2   |18|25|30|15|43|22|
|   3   |20|20|27|25|34|33|
|   4   |23|26|28|18|37|30|
|   5   |28|33|34|17|38|20|
|   6   |19|36|25|27|45|24|
+-------+--+--+--+--+--+--+

The objective is to determine an assignment of workers to machines that maximizes the total productivity. We may start by calculating a (non-optimal) heuristic solution using the following fairly natural method: choose the assignment p -> m with the highest productivity, cross out the line p and the column m (since the person has been placed and the machine has an operator), and restart this process until we have assigned all persons. The problem should then be solved to optimality using Mathematical Programming. And finally, solve the same problem to optimality, but for machines working in series.

Variables

prodmat                    The productivity matrix

Reference

Applications of optimization... Gueret, Prins, Seveaux

% Marcus Edvall, Tomlab Optimization Inc, E-mail: tomlab@tomopt.com
% Copyright (c) 2005-2009 by Tomlab Optimization Inc., $Release: 7.1.0$
% Written Oct 7, 2005.   Last modified Mar 8, 2009.

Problem setup

prodmat = [ 13 24 31 19 40 29;...
    18 25 30 15 43 22;...
    20 20 27 25 34 33;...
    23 26 28 18 37 30;...
    28 33 34 17 38 20;...
    19 36 25 27 45 24];

p = size(prodmat,1);  %workers
m = size(prodmat,2);  %machines

assign = tom('assign',p,m,'int');

% All variables are binary
bnds = {0 <= assign <= 1};

% Worker/machine constraints
con = {sum(assign,1) == 1, sum(assign,2) == 1};

% Objective
objective = -sum(sum(prodmat.*assign));

constraints = {bnds, con};
options = struct;
options.solver = 'cplex';
options.name   = 'Assigning Personnel to Machines';
sol1 = ezsolve(objective,constraints,[],options);
f_k1 = subs(objective,sol1);

% Series
pmin = tom('pmin',1,1);
bnds = {bnds, pmin >= 0};

% Productivity bounds 1
con2 = {sum(prodmat.*assign,2) >= pmin};
constraints = {constraints, con2};
objective = -pmin;
sol2 = ezsolve(objective,constraints,[],options);
f_k2 = subs(objective,sol2);

PriLev = 1;
if PriLev > 0
    m   = size(prodmat,1); % number of machines
    w   = m;               % number of workers
    x1  = sol1.assign;
    disp(['Best parallel work (' num2str(-f_k1) ') when '])
    [worker,machine] = find(x1);
    for i = 1:length(worker)
        disp(['   worker '           num2str(worker(i)) ...
            ' operates machine ' num2str(machine(i))])
    end
    x2  = sol2.assign;
    disp(['Best serial work (' num2str(-f_k2) ') when '])
    [worker,machine] = find(x2);
    for i = 1:length(worker)
        disp(['   worker '           num2str(worker(i)) ...
            ' operates machine ' num2str(machine(i))])
    end
end

% MODIFICATION LOG
%
% 051202 med   Created.
% 060117 per   Added documentation.
% 060126 per   Moved disp to end
% 090308 med   Converted to tomSym
Problem type appears to be: mip
===== * * * =================================================================== * * *
TOMLAB - Tomlab Optimization Inc. Development license  999001. Valid to 2010-02-05
=====================================================================================
Problem: ---  1: Assigning Personnel to Machines  f_k    -193.000000000000000000
                                                f(x_0)      0.000000000000000000

Solver: CPLEX.  EXIT=0.  INFORM=101.
CPLEX Branch-and-Cut MIP solver
Optimal integer solution found

FuncEv   12 
Problem type appears to be: mip
===== * * * =================================================================== * * *
TOMLAB - Tomlab Optimization Inc. Development license  999001. Valid to 2010-02-05
=====================================================================================
Problem: ---  1: Assigning Personnel to Machines  f_k     -26.000000000000000000
                                         sum(|constr|)      0.000000000000004653
                                f(x_k) + sum(|constr|)    -25.999999999999996000
                                                f(x_0)      0.000000000000000000

Solver: CPLEX.  EXIT=0.  INFORM=101.
CPLEX Branch-and-Cut MIP solver
Optimal integer solution found

FuncEv   68 
CPU time: 0.015625 sec. Elapsed time: 0.015000 sec. 
Best parallel work (193) when 
   worker 5 operates machine 1
   worker 6 operates machine 2
   worker 1 operates machine 3
   worker 3 operates machine 4
   worker 2 operates machine 5
   worker 4 operates machine 6
Best serial work (26) when 
   worker 3 operates machine 1
   worker 4 operates machine 1
   worker 5 operates machine 1
   worker 4 operates machine 2
   worker 5 operates machine 2
   worker 6 operates machine 2
   worker 2 operates machine 3
   worker 1 operates machine 4
   worker 6 operates machine 4
   worker 1 operates machine 5
   worker 4 operates machine 5
   worker 3 operates machine 6
   worker 4 operates machine 6