Material Requirement and Planning

Contents

Problem description

The company Minorette produces two types of large toy lorries for children: blue removal vans and red tank lorries. Each of these lorries is assembled from thirteen items. See below for the breakdown of components and the table below for the prices of the components.

Prices of components

+----------+--------------+--------+----------+---------+-----------+
|  Wheel   |Steel bar     |Bumper  |  Chassis |  Cabin  |Door window|
+----------+--------------+--------+----------+---------+-----------+
|  $ 0.30  |   $ 1        |$ 0.20  |  $ 0.80  |  $ 2.75 |  $ 0.10   |
+----------+--------------+--------+----------+---------+-----------+
|Windscreen|Blue container|Red tank|Blue motor|Red motor| Headlight |
+----------+--------------+--------+----------+---------+-----------+
|  $ 0.29  | $ 2.60       | $ 3    |  $ 1.65  |  $ 1.65 |  $ 0.15   |
+----------+--------------+--------+----------+---------+-----------+

Breakdown of components (Gozinto graph)

                         Blue lorry
                         (or red)
                             |
                             |
                             |
 +-----------+---------------+----------+-----------+
 |           |               |          |           |
1|          1|              1|         1|          2|
 |           |               |          |           |
Assembled   Blue container  Assembled  Blue motor  Headlight
chassis     (or red tank)   cabin      (or red)
 |                             |
 |                             |
 +-------+-----+        +------+-------+
 |       |     |        |      |       |
2|      2|    1|       1|     2|      1|
 |       |     |        |      |       |
Bumper  Axle  Chassis  Cabin  Door    Windscreen
         |                     window
         |
      +--+---+
      |      |
     2|     1|
      |      |
     Wheel  Steel bar

The subsets (axles, chassis, blue or red cabin) may be assembled by the company using the components, or subcontracted. The following table lists the costs for assembling and for subcontracting these subsets, together with the capacities of the company. The assembly costs do not take into account the buying prices of their components.

Subcontracting and assembly costs, assembly capacities

+--------------+------+------------+-----------+----------+---------+
|              | Axle |Assem chass |Assem cabin|Blue lorry|Red lorry|
+--------------+------+------------+-----------+----------+---------+
|Subcontracting|$12.75|   $ 30     | $ 3       |     -    |     -   |
|Assembly      |$6.80 |   $ 3.55   | $ 3.20    |   $ 2.20 |   $ 2.60|
|Capacity      | 600  |   4000     |  3000     |    4000  |    5000 |
+--------------+------+------------+-----------+----------+---------+

For the next month, Minorette has the same demand forecast of 3000 pieces for the two types of lorries. At present, the company has no stock. Which quantities of the different items should Minorette buy or subcontract to satisfy the demand while minimizing the production cost?

Variables

demand               The demand for tank and container lorries
compprices           The price of the components
subcontr             Cost for using a subcontracter to assemble
assembly             Price for own assembly
finalassembly        Price for final assembly
capacity             Capacity to assemble components
finalcapacity        Capacity to assemble final step
assemmat             12 first columns: component prices
                     next 3 columns: subcontracter price
                     next 3 columns: own assembly price
                     last 2 columns: final assembly

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

demand          = [3000;3000];
compprices      = [.3;1;.2;.8;2.75;.1;.29;2.6;3;1.65;1.65;.15];
subcontr        = [12.75;30;3];
assembly        = [6.8;3.55;3.20];
finalassembly   = [2.2;2.6];
capacity        = [600;4000;3000];
finalcapacity   = [4000;5000];

%Buy preprod (12), Buy subcontr (3), assemble (3), finalass (2)
assemmat = [ 1  0  0  0  0  0  0  0  0  0  0  0  0  0  0 -2  0  0  0  0;...
    0  1  0  0  0  0  0  0  0  0  0  0  0  0  0 -1  0  0  0  0;...
    0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  1 -2  0  0  0;...
    0  0  1  0  0  0  0  0  0  0  0  0  0  0  0  0 -2  0  0  0;...
    0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0 -1  0  0  0;...
    0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0  0 -1  0  0;...
    0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0  0 -2  0  0;...
    0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0 -1  0  0;...
    0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  1  0 -1 -1;...
    0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0 -1  0;...
    0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0  0  0 -1;...
    0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0  0  1 -1 -1;...
    0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0 -1  0;...
    0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0  0  0 -1;...
    0  0  0  0  0  0  0  0  0  0  0  1  0  0  0  0  0  0 -2 -2];

p = length(compprices);
preprod = tom('preprod',p,1);
subcont = tom('subcont',3,1);
assemble = tom('assemble',3,1);
finalass = tom('finalass',2,1);

% Bounds
bnds = {preprod >= 0, subcont >= 0, assemble >= 0, ...
    finalass >= 0};

bnds2 = {finalass >= demand, assemble <= capacity, ...
    finalass <= finalcapacity};

% For assembled products, some has to be 2 times the other
con = {assemmat*[preprod;subcont;assemble;finalass] >= 0};

% Objective
objective = compprices'*preprod + subcontr'*subcont + ...
    assembly'*assemble + finalassembly'*finalass;

constraints = {bnds, bnds2, con};
options = struct;
options.solver = 'cplex';
options.name   = 'Material Requirement Planning';
sol = ezsolve(objective,constraints,[],options);

PriLev = 1;
if PriLev > 0
    buycomponent      = sol.preprod;
    buysubcontracter  = sol.subcont;
    buyassembly       = sol.assemble;
    buyfinalassembly  = sol.finalass;
    disp('Buy these components:')
    for i = 1:length(buycomponent)
        if buycomponent(i) > 0,
            disp(['   ' num2str(buycomponent(i)) ' units of type ' num2str(i) ])
        end
    end
    disp('Use these subcontracters:')
    for i = 1:length(buysubcontracter)
        if buysubcontracter(i) > 0,
            disp(['   ' num2str(buysubcontracter(i)) ' assemblies of type ' num2str(i) ])
        end
    end
    disp('Do this assembly:')
    for i = 1:length(buyassembly)
        if buyassembly(i) > 0,
            disp(['   ' num2str(buyassembly(i)) ' assemblies of type ' num2str(i) ])
        end
    end
    disp('Do this final assembly:')
    for i = 1:length(buyfinalassembly)
        if buyfinalassembly(i) > 0,
            disp(['   ' num2str(buyfinalassembly(i)) ' assemblies of type ' num2str(i) ])
        end
    end
end

% MODIFICATION LOG
%
% 051018 med   Created.
% 060110 per   Added documentation.
% 060125 per   Moved disp to end
% 090308 med   Converted to tomSym
Problem type appears to be: lp
===== * * * =================================================================== * * *
TOMLAB - Tomlab Optimization Inc. Development license  999001. Valid to 2010-02-05
=====================================================================================
Problem: ---  1: Material Requirement Planning  f_k  238365.000000000000000000
                                              f(x_0)      0.000000000000000000

Solver: CPLEX.  EXIT=0.  INFORM=1.
CPLEX Dual Simplex LP solver
Optimal solution found

FuncEv    1 Iter    1 
Buy these components:
   1200 units of type 1
   600 units of type 2
   600 units of type 3
   300 units of type 4
   3000 units of type 8
   3000 units of type 9
   3000 units of type 10
   3000 units of type 11
   12000 units of type 12
Use these subcontracters:
   5700 assemblies of type 2
   6000 assemblies of type 3
Do this assembly:
   600 assemblies of type 1
   300 assemblies of type 2
Do this final assembly:
   3000 assemblies of type 1
   3000 assemblies of type 2