Planning the Production of Fiberglass

Contents

Problem description

A company produces fiberglass by the cubic meter and wishes to plan its production for the next six weeks. The production capacity is limited, and this limit takes a different value in every time period. The weekly demand is known for the entire planning period. The production and storage costs also take different values depending on the time period. All data are listed in the following table.

Data per week

+----+------------+------+----------+-----------+
|    | Production |Demand|Production| Storage   |
|Week|capacity(m3)| (m3) |cost($/m3)|cost ($/m3)|
+----+------------+------+----------+-----------+
|  1 |    140     | 100  |   5      |   0.2     |
|  2 |    100     | 120  |   8      |   0.3     |
|  3 |    110     | 100  |   6      |   0.2     |
|  4 |    100     |  90  |   6      |   0.25    |
|  5 |    120     | 120  |   7      |   0.3     |
|  6 |    100     | 110  |   6      |   0.4     |
+----+------------+------+----------+-----------+

Which is the production plan that minimizes the total cost of production and storage?

Variables

capacity          Production capacity over time
demand            Demand over time
prodcost          Cost to produce over time
storcost          Cost to store over time

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

capacity = [140;100;110;100;120;100];
demand   = [100;120;100; 90;120;110];
prodcost = [  5;  8;  6;  6;  7;  6];
storcost = [ .2; .3; .2;.25; .3; .4];

% No variables are integers (cost flow system)
m = length(capacity);
flow = tom('flow',m*2-1,1);

% Bounds
bnds = {flow >= 0, flow(1:2:end) <= capacity};

% First node constraint
con1 = {flow(1) - flow(2) == demand(1)};

% Constraints for all other nodes, except final
con2 = {flow(2:2:end-3) + flow(3:2:end-2) - flow(4:2:end-1) == demand(2:end-1)};

% Final node constraint
con3 = {flow(end-1) + flow(end) == demand(end)};

% Objective
objective = prodcost'*flow(1:2:end) + storcost(1:end-1)'*flow(2:2:end-1);

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

PriLev = 1;
if PriLev > 0
    times = length(capacity);
    produce = sol.flow(1:2:end);
    store   = [sol.flow(2:2:end-1); 0];
    for t = 1:times,
        if produce(t) > 0 | store(t) > 0,
            disp(['during month ' num2str(t) ])
            if produce(t) > 0,
                disp(['   produce  ' num2str(produce(t))])
            end
            if store(t) > 0,
                disp(['   store  ' num2str(store(t)) ' to next month'])
            end
        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: Production of Fiber Glass      f_k    3988.000000000000000000
                                              f(x_0)      0.000000000000000000

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

FuncEv    2 Iter    2 
during month 1
   produce  140
   store  40 to next month
during month 2
   produce  80
during month 3
   produce  110
   store  10 to next month
during month 4
   produce  100
   store  20 to next month
during month 5
   produce  110
   store  10 to next month
during month 6
   produce  100