Paint Production

Contents

Problem description

As a part of its weekly production a paint company produces five batches of paints, always the same, for some big clients who have a stable demand. Every paint batch is produced in a single production process, all in the same blender that needs to be cleaned between two batches. The durations of blending paint batches 1 to 5 are respectively 40, 35, 45, 32, and 50 minutes. The cleaning times depend on the colors and the paint types. For example, a long cleaning period is required if an oil-based paint is produced after a water-based paint, or to produce white paint after a dark color. The times are given in minutes in the following table CLEAN where CLEANij denotes the cleaning time between batch i and batch j.

Matrix of cleaning times

+-+--+--+--+--+--+
| | 1| 2| 3| 4| 5|
+-+--+--+--+--+--+
|1| 0|11| 7|13|11|
|2| 5| 0|13|15|15|
|3|13|15| 0|23|11|
|4| 9|13| 5| 0| 3|
|5| 3| 7| 7| 7| 0|
+-+--+--+--+--+--+

Since the company also has other activities, it wishes to deal with this weekly production in the shortest possible time (blending and cleaning). Which is the corresponding order of paint batches? The order will be applied every week, so the cleaning time between the last batch of one week and the first of the following week needs to be counted for the total duration of cleaning.

Variables

cleantimes        Times to clean from batch i to j
prodtimes         Production times per batch

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

cleantimes = [ 0 11  7 13 11;...
    5  0 13 15 15;...
    13 15  0 23 11;...
    9 13  5  0  3;...
    3  7  7  7  0];

prodtimes  = [40;35;45;32;50];

n = size(cleantimes,1);
succ = tom('succ',n,n,'int');
y = tom('y',n,1);

% All slots are integers
bnds = {0 <= succ <= 1, y >= 0, succ((1:n+1:n^2)) == 0};

% Only one transition at a given time
con1 = {sum(succ,1) == 1};

% Only one transition to a given batch
con2 = {sum(succ,2) == 1};

% Sub-cycle constraint
con3 = cell(n*(n-1),1);
for i=1:n
    for j=2:n
        con3{(i-1)*(n-1)+j-1} = {y(j) >= y(i)+1-n*(1-succ(i,j))};
    end
end

% Objective
objective = sum(sum((repmat(prodtimes,1,n) + cleantimes).*succ));

constraints = {bnds, con1, con2, con3};
options = struct;
options.solver = 'cplex';
options.name   = 'Paint Production';
sol = ezsolve(objective,constraints,[],options);

PriLev = 1;
if PriLev > 0
    temp1 = [sol.succ, sol.y];
    link    = [];  % connections

    for i = 1:n
        for j = 1:n
            if temp1(i,j) == 1
                link = [[i j ]; link ]; % finding connections

            end
        end
    end

    first = link(1:1);    % start batch
    next =  link(1,2);    % next batch
    order = first;        % ordered batches

    for k = 1:n
        order = [order next];     % adding next
        next =  link(find(link(:,1)==next),2); % finding new next
    end
    disp(['one best order: ' num2str(order)])  % display solution
end

% MODIFICATION LOG
%
% 051010 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: Paint Production               f_k     243.000000000000000000
                                              f(x_0)      0.000000000000000000

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

FuncEv   36 
one best order: 5  2  1  4  3  5