Sequencing Jobs on a Bottleneck Machine

Contents

Problem description

In workshops it frequently happens that a single machine determines the throughput of the entire production (for example, a machine of which only one is available, the slowest machine in a production line, etc.). This machine is called the critical machine or the bottleneck. In such a case it is important to schedule the tasks that need to be performed by this machine in the best possible way. The aim of the problem is to provide a simple model for scheduling operations on a single machine and that may be used with different objective functions. We shall see here how to minimize the total processing time, the average processing time, and the total tardiness. A set of tasks (or jobs) is to be processed on a single machine. The execution of tasks is non-preemptive (that is, an operation may not be interrupted before its completion). For every task i its release date and duration are given. For the last optimization criterion (total tardiness), a due date (latest completion time) is also required to measure the tardiness, that is, the amount of time by which the completion of jobs exceeds their respective due dates. The following table lists the data for our problem.

What is the optimal value for each of the objectives: 1 - minimizing the total duration of the schedule (= makespan)? 2 - minimizing the mean processing time? 3 - minimizing the total tardiness?

Task time windows and durations

+------------+--+--+--+--+--+--+--+
|Job         | 1| 2| 3| 4| 5| 6| 7|
+------------+--+--+--+--+--+--+--+
|Release date| 2| 5| 4| 0| 0| 8| 9|
|Duration    | 5| 6| 8| 4| 2| 4| 2|
|Due date    |10|21|15|10| 5|15|22|
+------------+--+--+--+--+--+--+--+

Variables

releasedate        Release dates of jobs (row 1 in table)
duration           Time to perform a job (row 2 in table)
duedate            Deadline of each job  (row 3 in table)

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.2.0$
% Written Oct 7, 2005.   Last modified Apr 8, 2009.

Problem setup

releasedate = [2 5 4 0 0 8 9]';
duration    = [5 6 8 4 2 4 2]';
duedate     = [10 21 15 10 5 15 22]';

j = 7;
k = 7;

rank = tom('rank',j,k,'int');
start = tom('start',k,1,'int');

% All slots are integers
bnds = {0 <= rank <= 1, start >= 0};

% Assignment constraint one job per rank.
con1 = {sum(rank,2) == 1};

% Assignment constraint one rank per job.
con2 = {sum(rank,1) == 1};

% Release constraints.
con3 = {start >= (releasedate'*rank)'};

% No simultaneous constraints
con4 = {start(2:end) >= start(1:end-1) + (duration'*rank(:,1:end-1))'};

% Objective 1
objective = start(end) + sum(duration'*rank(:,end));

constraints = {bnds, con1, con2, con3, con4};
options = struct;
options.solver = 'cplex';
options.name   = 'Sequencing with Bottleneck';
sol1 = ezsolve(objective,constraints,[],options);

% Objective 2
comp = tom('comp',k,1,'int');
bnds2 = {comp >= 0};
con5 = {comp == start + (duration'*rank)'};
objective = sum(comp);
constraints = {constraints, bnds2, con5};
sol2 = ezsolve(objective,constraints,[],options);

% Objective 3
late = tom('late',k,1,'int');
bnds3 = {late >= 0};
con6 = {late >= comp - (duedate'*rank)'};
constraints = {constraints, bnds3, con6};
objective = sum(late);
sol3 = ezsolve(objective,constraints,[],options);

PriLev = 1;
if PriLev > 0
    j         = length(releasedate); % number of jobs
    sequence2 = [sol2.rank, sol2.start, sol2.comp]; % results from 1 and 2
    sequence3 = [sol3.rank, sol3.start, sol3.comp, sol3.late]; % results from 3
    sequence2(find(sequence2(1:7*7)<0.1)) = 0; % remove bad zeros
    sequence3(find(sequence3(1:7*7)<0.1)) = 0; % remove bad zeros
    s2 = [];                                   % blank sequence
    s3 = [];                                   % blank sequence
    for t = 1:j,
        s2 = [s2 find(sequence2(t,1:j))];
        s3 = [s3 find(sequence3(t,1:j))];
    end
    disp(['An order to minimize duration (=' ...
        num2str(sequence2(j,j+2)) ') and to minimize mean '...
        'processing time (=' num2str(sequence2(j,j+2)/j) ')'])
    disp(num2str(s2))
    disp(' ')
    tard = sum(sequence3(:,size(sequence3,2)));
    disp(['An order to minimize tardiness (=' num2str(tard) ')' ])
    disp(num2str(s3))
    disp(' ')
end

% MODIFICATION LOG
%
% 060102 med   Created.
% 060111 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: Sequencing with Bottleneck     f_k      31.000000000000000000
                                              f(x_0)      0.000000000000000000

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

FuncEv   42 
Problem type appears to be: mip
===== * * * =================================================================== * * *
TOMLAB - Tomlab Optimization Inc. Development license  999001. Valid to 2010-02-05
=====================================================================================
Problem: ---  1: Sequencing with Bottleneck     f_k     103.000000000000000000
                                              f(x_0)      0.000000000000000000

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

FuncEv   51 
CPU time: 0.015625 sec. Elapsed time: 0.016000 sec. 
Problem type appears to be: mip
===== * * * =================================================================== * * *
TOMLAB - Tomlab Optimization Inc. Development license  999001. Valid to 2010-02-05
=====================================================================================
Problem: ---  1: Sequencing with Bottleneck     f_k      18.000000000000000000
                                       sum(|constr|)      0.000000000000007994
                              f(x_k) + sum(|constr|)     18.000000000000007000
                                              f(x_0)      0.000000000000000000

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

FuncEv   70 
CPU time: 0.015625 sec. Elapsed time: 0.016000 sec. 
An order to minimize duration (=31) and to minimize mean processing time (=4.4286)
3  6  7  2  1  5  4
 
An order to minimize tardiness (=18)
2  5  7  3  1  4  6