TomSym Tank Loading
From TomWiki
Jump to navigationJump to search
This page is part of the TomSym Manual. See TomSym Manual. |
Problem description
Five tanker ships have arrived at a chemical factory. They are carrying loads of liquid products that must not be mixed: 1200 tonnes of Benzol, 700 tonnes of Butanol, 1000 tonnes of Propanol, 450 tonnes of Styrene, and 1200 tonnes of THF. Nine tanks of different capacities are available on site. Some of them are already partially filled with a liquid. The following table lists the characteristics of the tanks (in tonnes). Into which tanks should the ships be unloaded (question 1) to maximize the capacity of the tanks that remain unused, or (question 2) to maximize the number of tanks that remain free?
Characteristics of tanks
+---------------+---+------+---+---+---+---+---+---+---+ |Tank | 1| 2 | 3| 4| 5| 6| 7| 8| 9| +---------------+---+------+---+---+---+---+---+---+---+ |Capacity |500| 400 |400|600|600|900|800|800|800| |Current product| -|Benzol| -| -| -| -|THF| -| -| |Quantity | 0| 100 | 0| 0| 0| 0|300| 0| 0| +---------------+---+------+---+---+---+---+---+---+---+
Variables
capacity Capacity of Empty tanks products Amount of incoming chemicals
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 = [500;0;400;600;600;900;0;800;800];
products = [1200-300;700;1000;450;1200-500];
l = length(products);
m = length(capacity);
load = tom('load',l,m,'int');
% Binary variables
bnds = {0 <= load <= 1};
% Load constraint, the liquids have to go
con1 = {load*capacity >= products};
% Only one product per tank
con2 = {sum(load,1) <= 1};
% Objective
objective = sum(load*capacity);
constraints = {bnds, con1, con2};
options = struct;
options.solver = 'cplex';
options.name = 'Tank Loading';
sol = ezsolve(objective,constraints,[],options);
remaining = sum(capacity)-subs(objective,sol);
PriLev = 1;
if PriLev > 0
disp('NB: Tank 2 and tank 7 are filled before the optimization starts.')
temp = sol.load';
ships = length(products);
for ship = 1:ships,
tank = find(temp(:,ship));
disp(['Ship number ' num2str(ship) ' unloads in tank(s) ' num2str(tank')])
end
end
% MODIFICATION LOG
%
% 051010 med Created
% 051208 med Added remaining the return
% 060112 per Added documentation.
% 060124 per Interpretation of results upgraded.
% 060125 per Moved disp to end
% 090308 med Converted to tomSym
Problem type appears to be: mip Time for symbolic processing: 0.014707 seconds Starting numeric solver ===== * * * =================================================================== * * * TOMLAB - TOMLAB Development license 999007. Valid to 2011-12-31 ===================================================================================== Problem: --- 1: Tank Loading f_k 4000.000000000000000000 f(x_0) 0.000000000000000000 Solver: CPLEX. EXIT=0. INFORM=101. CPLEX Branch-and-Cut MIP solver Optimal integer solution found FuncEv 8 CPU time: 0.015600 sec. Elapsed time: 0.003000 sec. NB: Tank 2 and tank 7 are filled before the optimization starts. Ship number 1 unloads in tank(s) 6 Ship number 2 unloads in tank(s) 9 Ship number 3 unloads in tank(s) 3 5 Ship number 4 unloads in tank(s) 1 Ship number 5 unloads in tank(s) 8