# UIMP - Production Scheduling Problem

TomSym implementation of GAMS Example (UIMP,SEQ=11)

A company manufactures nuts, bolts and washers using three different machines that can be operated in normal or overtime production mode. The company needs to plan operations for the next two periods.

Ellison, E F D, and Mitra, P, UIMP - User Interface for Mathematical Programming. ACM Transactions on Mathematical Software 8, 2 (1982).

i: time periods (summer, winter) j: production mode (normal, overtime) k: products (nuts, bolts, washers) l: machines (m1, m2, m3)

```% Machine hours (hours per unit), mh(l,k)
mh = [ 4  4  6
7  6  6
3  0  0 ];

1   0 ];

%  Availability  (hours)
av = [ 100  80
100  90
40  30 ];

% Machine hours required
t = zeros(2,2,3,3);
for i=1:2
for j=1:2
for k=1:3
for l=1:3
t(i,j,k,l) = mh(l,k);
if mh(l,k) > 0
end
end
end
end
end
t(2,2,3,1) = 5;

% Machine hours available;
a = zeros(2,2,3);
a(1,:,:) = av';
a(2,:,:) = av'+10;

% Production cost data
tc = [ 2 3 4
4 3 2
1 0 0 ];

1 2 ];

% Production cost
c = zeros(2,2,3,3);
for i=1:2
for j=1:2
for k=1:3
for l=1:3
c(i,j,k,l) = tc(l,k);
if tc(l,k) > 0
end
end
end
end
end

% Selling price
p = [ 10 10  9
11 11 10 ];

% Demand
d = [ 25 30 30
30 25 25 ];

% Storage cost
s = ones(3,1);

% Storage capacity
h = [20;20;0];

% Production
toms 3x3 x11 x12 x21 x22

% Products stored
toms 2x3 y

% Products sold
toms 2x3 z

%  Positive Variables: x, y
cbnd = {x11 >= 0, x12 >= 0, x21 >= 0, x22 >= 0, y >= 0};

% m3 can only produce nuts
cbnd = {cbnd{:}, x11(2:3,3) <= 0, x12(2:3,3) <= 0, ...
x21(2:3,3) <= 0, x22(2:3,3) <= 0};

cost = 0;
for i=1:2
for k=1:3
cost = cost + s(k)*y(i,k);
if i == 1
cost = cost + sum(squeeze(c(1,1,k,:)).*x11(k,:)'+...
squeeze(c(1,2,k,:)).*x12(k,:)');
else
cost = cost + sum(squeeze(c(2,1,k,:)).*x21(k,:)'+...
squeeze(c(2,2,k,:)).*x22(k,:)');
end
end
end

revenue = sum(sum(p.*z));

profit = revenue - cost;

eq1 = {};
for l=1:3
eq1 = {eq1{:}, sum(squeeze(t(1,1,:,l)).*x11(:,l)) <= a(1,1,l)};
eq1 = {eq1{:}, sum(squeeze(t(1,2,:,l)).*x12(:,l)) <= a(1,2,l)};
eq1 = {eq1{:}, sum(squeeze(t(2,1,:,l)).*x21(:,l)) <= a(2,1,l)};
eq1 = {eq1{:}, sum(squeeze(t(2,2,:,l)).*x22(:,l)) <= a(2,2,l)};
end

eq2 = {};
for i=1:2
for k=1:3
if i>1
eq2 = {eq2; sum(x21(k,:)+x22(k,:))...
+ y(i-1,k) == z(i,k) + y(i,k)};
else
eq2 = {eq2; sum(x11(k,:)+x12(k,:))...
== z(i,k) + y(i,k)};
end
end
end

eq3 = {z >= d; y <= [h'; h']};

solution1 = ezsolve(-revenue,{cbnd, eq1, eq2, eq3});
solution2 = ezsolve(-profit,{cbnd, eq1, eq2, eq3});

disp(' ');
disp('Maximum revenue:');
disp(subs(revenue,solution1));

disp('Maximum profit:');
disp(subs(profit,solution2));
```
```Problem type appears to be: lp
===== * * * =================================================================== * * *
TOMLAB - Tomlab Optimization Inc. Development license  999001. Valid to 2010-02-05
=====================================================================================
Problem: ---  1:                                f_k   -2251.190476190476100000
f(x_0)      0.000000000000000000

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

FuncEv   20 Iter   20
CPU time: 0.015625 sec. Elapsed time: 0.016000 sec.
Problem type appears to be: lp
===== * * * =================================================================== * * *
TOMLAB - Tomlab Optimization Inc. Development license  999001. Valid to 2010-02-05
=====================================================================================
Problem: ---  1:                                f_k   -1571.047619047619000000
f(x_0)      0.000000000000000000

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

FuncEv   22 Iter   22

Maximum revenue:
2.2512e+003

Maximum profit:
1.5710e+003

```