Models Ground transport

From TomWiki
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Notice.png

This page is part of TOMLAB Models. See TOMLAB Models.

Car rental

% function Result = carrentalEx(PriLev)
%
% Creates a TOMLAB MIP problem for car rental
%
% CAR RENTAL
%
% A small car rental company has a fleet of 94 vehicles distributed
% among its 10 agencies. The location of every agency is given by its
% geographical coordinates X and Y in a grid based on kilometers. We
% assume that the road distance between agencies is approximately 1.3
% times the Euclidean distance (as the crow flies). The following
% table indicates the coordinates of all agencies, the number of cars
% required the next morning, and the stock of cars in the evening
% preceding this day.
%
% Description of the vehicle rental agencies
%
% +-------------+--+--+--+--+--+--+--+--+--+--+
% |Agency       | 1| 2| 3| 4| 5| 6| 7| 8| 9|10|
% +-------------+--+--+--+--+--+--+--+--+--+--+
% |X coordinate | 0|20|18|30|35|33| 5| 5|11| 2|
% |Y coordinate | 0|20|10|12| 0|25|27|10| 0|15|
% +-------------+--+--+--+--+--+--+--+--+--+--+
% |Required cars|10| 6| 8|11| 9| 7|15| 7| 9|12|
% |Cars present | 8|13| 4| 8|12| 2|14|11|15| 7|
% +-------------+--+--+--+--+--+--+--+--+--+--+
%
% Supposing the cost for transporting a car is $ 0.50 per km,
% determine the movements of cars that allow the company to
% re-establish the required numbers of cars at all agencies,
% minimizing the total cost incurred for transport.
%
% VARIABLES
%
% demand                     Required cars per agency
% stock                      Cars present
% cost                       Cost per km to transport a car
% xcord                      The X-coordinate of agencies
% ycord                      The Y-coordinate of agencies
% n                          Number of agencies
% distance                   A matrix of distances
%
% RESULTS
%
% For an interpretation of the results, try this:
% Result          = carrentalEx(2);
%
% REFERENCES
%
% Applications of optimization... Gueret, Prins, Seveaux
% http://web.univ-ubs.fr/lester/~sevaux/pl/index.php
%
% INPUT PARAMETERS
% PriLev       Print Level
%
% OUTPUT PARAMETERS
% Result       Result structure.

% Marcus Edvall, Tomlab Optimization Inc, E-mail: tomlab@tomopt.com
% Copyright (c) 2005-2005 by Tomlab Optimization Inc., $Release: 5.0.0$
% Written Oct 19, 2005.   Last modified Oct 19, 2005.

function Result = carrentalEx(PriLev)

if nargin < 1
   PriLev = 1;
end

demand          = [10   6   8  11   9   7  15   7   9  12]';
stock           = [ 8  13   4   8  12   2  14  11  15   7]';
cost            = 0.50;

xcord           = [ 0  20  18  30  35  33   5   5  11   2]';
ycord           = [ 0  20  10  12   0  25  27  10   0  15]';
n               = length(xcord);

distance        = zeros(n,n);

for i=1:n
   for j=1:n
      distance(i,j) = 1.3*sqrt( (xcord(i) - xcord(j))^2 + (ycord(i) - ycord(j))^2);
   end
end

Prob = carrental(cost, distance, stock, demand);
Result = tomRun('cplex', Prob, PriLev);

if PriLev > 1,
   idx_excess      = find(stock-demand > 0);
   idx_need        = find(stock-demand < 0);
   n_excess        = length(idx_excess);
   n_need          = length(idx_need);
   temp            = reshape(Result.x_k,n_excess,n_need);

   disp('THE SENDING OF CARS')
   for i = 1:n_excess,       % scan all positions, disp interpretation
      disp(['agency ' num2str(idx_excess(i)) ' sends: ' ])
      for j = 1:n_need,
         if temp(i,j) ~= 0
            disp(['   ' num2str(temp(i,j)) ' car(s) to agency ' ...
                  num2str(idx_need(j))])
         end
      end
      disp(' ')
   end

   disp('THE GETTING OF CARS')
   for j = 1:n_need,
      disp(['agency ' num2str(idx_need(j)) ' gets: ' ])
      for i = 1:n_excess,       % scan all positions, disp interpretation
         if temp(i,j) ~= 0
            disp(['   ' num2str(temp(i,j)) ' car(s) from agency ' ...
                  num2str(idx_excess(i))])
         end
      end
      disp(' ')
   end
end
% MODIFICATION LOG
%
% 051019 med   Created.
% 060112 per   Added documentation.
% 060125 per   Moved disp to end

Choosing the mode of transport

% function Result = choosingthemodeoftransportEx(PriLev)
%
% Creates a TOMLAB MIP problem for choosing the mode of transport
%
% CHOOSING THE MODE OF TRANSPORT
%
% A company in the south-west of France needs to transport 180 tonnes
% of chemical products stored in depots D1 to D4 to the three
% recycling centers C1, C2, and C3. The depots D1 to D4 contain
% respectively 50, 40, 35, and 65 tonnes, that is 190 tonnes in
% total. Two modes of transport are available: road and rail. Depot
% D1 only delivers to centers C1 and C2 and that by road at a cost of
% $ 12k/t and $ 11k/t. Depot D2 only delivers to C2, by rail or road
% at $ 12k/t and $ 14k/t respectively. Depot D3 delivers to center C2
% by road ($ 9k/t) and to C3 by rail or road for $ 4k/t and $ 5k/t
% respectively. The depot D4 delivers to center C2 by rail or road at
% a cost of $ 11k/t and $ 14k/t, and to C3 by rail or road at $ 10k/t
% and $ 14k/t respectively.
%
% Its contract with the railway company for the transport of chemical
% products requires the company to transport at least 10 tonnes and
% at most 50 tonnes for any single delivery. Besides the standard
% security regulations, there are no specific limitations that apply
% to road transport. How should the company transport the 180 tonnes
% of chemicals to minimize the total cost of transport?
%
% Graph of connections.
%
%                    ------  7 (road) \
%       +--  2 (D1)        /           \
%      /            \     /             12 (C1)
%     /              \   /             /
%    /              --+--    6 (rail) /         \
%   |    +-  3 (D2)   |     /                    \
%   |   /           --+----/                      \
%   |  /              |                            \
%   | /               |                             \
%                +----+----  8 (rail) \              \
%   1           /      \               \
%     \        /        \               13 (C2) ----- 15
%   |  \      /          \             /
%   |   \                 \  9 (road) /              /
%   |    +-- 5 ------------                         /
%   |     (D4) \     ------                        /
%   |           \   /                             /
%    \           +--+-----  10 (rail) \          /
%     \             /     /            \        /
%      \       ----+     /              14 (C3)
%       +--- 4 ---------+              /
%        (D3) \             11 (road) /
%              +-----------
%
%
% VARIABLES
%
% arcs_out/in                For an arc i arcs_out(i) is its starting node
%                            and arcs_in(i) ts target node
% arcs_min                   Minimal load for an arc
% arcs_max                   Maximal load for an arc
% arcs_cost                  Cost for an arc
% minflow                    Flow from 1 to 15
%
% RESULTS
%
% For an interpretation of the results, try the following
% Result   = choosingthemodeoftransportEx(2);
%
% REFERENCES
%
% Applications of optimization... Gueret, Prins, Seveaux
% http://web.univ-ubs.fr/lester/~sevaux/pl/index.php
%
% INPUT PARAMETERS
% PriLev       Print Level
%
% OUTPUT PARAMETERS
% Result       Result structure.

% Marcus Edvall, Tomlab Optimization Inc, E-mail: tomlab@tomopt.com
% Copyright (c) 2005-2005 by Tomlab Optimization Inc., $Release: 5.0.0$
% Written Oct 19, 2005.   Last modified Oct 19, 2005.

function Result = choosingthemodeoftransportEx(PriLev)

if nargin < 1
   PriLev = 1;
end

arcs_out        = [ 1  1  1  1  2  2  3  3  4  4  4  5  5  5  5 ...
      6  7  8  9 10 11 12 13 14 ]';
arcs_in         = [ 2  3  4  5  7  9  6  7  9 10 11  8  9 10 11 ...
      12 12 13 13 14 14 15 15 15 ]';
arcs_min        = [zeros(1,6) 10 0 0 10 0 10 0 10 0 ...
      zeros(1,9)]';
arcs_max        = [50 30 35 65 inf inf 50 inf inf 50 inf 50 inf 50 inf ...
      inf*ones(1,9)]';
arcs_cost       = [0 0 0 0 12 11 12 14 9 4 5 11 14 10 14 ...
      zeros(1,9) ]';
minflow         = 50+30+35+65;

Prob = choosingthemodeoftransport(arcs_out, arcs_in, arcs_min, arcs_max, arcs_cost, minflow);

Result = tomRun('cplex', Prob, PriLev);

if PriLev > 1,
   arcs     = Result.x_k;

   disp('transport as follows:')

   for i = 1:length(arcs),
      if arcs(i) ~= 0,
         disp(['    ' num2str(arcs(i)) ' units from node ' ...
               num2str(arcs_out(i)) ' to node ' num2str(arcs_in(i))])
      end
   end

end

% MODIFICATION LOG
%
% 051019 med   Created.
% 060112 per   Added documentation.
% 060125 per   Moved disp to end

Depot location

% function Result = depotlocationEx(PriLev)
%
% Creates a TOMLAB MIP problem for depot location
%
% DEPOT LOCATION
%
% A large company wishes to open new depots to deliver to its sales
% centers. Every new set-up of a depot has a fixed cost. Goods are
% delivered from a depot to the sales centers close to the site.
% Every delivery has a cost that depends on the distance covered. The
% two sorts of cost are quite different: set-up costs are capital
% costs which may usually be written off over several years, and
% transport costs are operating costs. A detailed discussion of how
% to combine these two costs is beyond the scope of this text — we
% assume here that they have been put on some comparable basis,
% perhaps by taking the costs over a year.
%
% There are 12 sites available for the construction of new depots and
% 12 sales centers need to receive deliveries from these depots.
%
% The following table gives the costs (in thousand $) of satisfying
% the entire demand of each customer (sales center) from a depot (not
% the unit costs). So, for instance, the cost per unit of supplying
% customer 9 (who has a total demand of 30 tonnes according to the
% next table) from depot 1 is $ 60000/30t, i.e. $ 2000/t. Certain
% deliveries that are impossible are marked with "Inf".
%
% Delivery costs for satisfying entire demand of customers
%
% +-----+-----------------------------------------------+
% |     |               Customer                        |
% |Depot|  1   2   3   4   5   6   7   8   9  10  11  12|
% +-----+---+---+---+---+---+---+---+---+---+---+---+---+
% |   1 |100| 80| 50| 50| 60|100|120| 90| 60| 70| 65|110|
% |   2 |120| 90| 60| 70| 65|110|140|110| 80| 80| 75|130|
% |   3 |140|110| 80| 80| 75|130|160|125|100|100| 80|150|
% |   4 |160|125|100|100| 80|150|190|150|130|Inf|Inf|Inf|
% |   5 |190|150|130|Inf|Inf|Inf|200|180|150|Inf|Inf|Inf|
% |   6 |200|180|150|Inf|Inf|Inf|100| 80| 50| 50| 60|100|
% |   7 |100| 80| 50| 50| 60|100|120| 90| 60| 70| 65|110|
% |   8 |120| 90| 60| 70| 65|110|140|110| 80| 80| 75|130|
% |   9 |140|110| 80| 80| 75|130|160|125|100|100| 80|150|
% |  10 |160|125|100|100| 80|150|190|150|130|Inf|Inf|Inf|
% |  11 |190|150|130|Inf|Inf|Inf|200|180|150|Inf|Inf|Inf|
% |  12 |200|180|150|Inf|Inf|Inf|100| 80| 50| 50| 60|100|
% +-----+---+---+---+---+---+---+---+---+---+---+---+---+
%
% In addition, for every depot we have the following information: the
% fixed cost for constructing the depot that needs to be included
% into the objective function and its capacity limit, all listed in
% the table below.
%
% Fix costs and capacity limits of the depot locations
%
%+------------+----+----+-----+----+----+----+----+----+----+-----+----+----+
%|Depot       |   1|   2|    3|   4|   5|   6|   7|   8|   9|   10|  11|  12|
%+------------+----+----+-----+----+----+----+----+----+----+-----+----+----+
%|Cost (k$)   |3500|9000|10000|4000|3000|9000|9000|3000|4000|10000|9000|3500|
%|Capacity (t)| 300| 250|  100| 180| 275| 300| 200| 220| 270|  250| 230| 180|
%+------------+----+----+-----+----+----+----+----+----+----+-----+----+----+
%
% The quantities demanded by the sales centers (customers), are
% summarized in the following table.
%
% Demand data
% +----------+---+--+--+---+---+---+--+--+--+---+--+---+
% |Customer  |  1| 2| 3|  4|  5|  6| 7| 8| 9| 10|11| 12|
% +----------+---+--+--+---+---+---+--+--+--+---+--+---+
% |Demand (t)|120|80|75|100|110|100|90|60|30|150|95|120|
% +----------+---+--+--+---+---+---+--+--+--+---+--+---+
%
% In every case, the demand of a customer needs to be satisfied but a
% sales center may be delivered to from several depots. Which depots
% should be opened to minimize the total cost of construction and of
% delivery, whilst satisfying all demands?
%
% VARIABLES
%
% delcosts                   Costs to deliver to centre from depot
% idxinf                     Impossible combination of centre/depot
% delcosts(idxinf)           A large number < Inf
% buildcosts                 Costs to build a depot=
% capacity                   Capacities per potential depot
% demand                     The customers demand in tonnes
%
% RESULTS
%
% To interpret the results run this:
% Result  = depotlocationEx(2);
%
% REFERENCES
%
% Applications of optimization... Gueret, Prins, Seveaux
% http://web.univ-ubs.fr/lester/~sevaux/pl/index.php
%
% INPUT PARAMETERS
% PriLev       Print Level
%
% OUTPUT PARAMETERS
% Result       Result structure.

% Marcus Edvall, Tomlab Optimization Inc, E-mail: tomlab@tomopt.com
% Copyright (c) 2005-2005 by Tomlab Optimization Inc., $Release: 5.0.0$
% Written Oct 19, 2005.   Last modified Oct 19, 2005.

function Result = depotlocationEx(PriLev)

if nargin < 1
   PriLev = 1;
end

delcosts     = [ 100  80  50  50  60 100 120  90  60  70  65 110;...
      120  90  60  70  65 110 140 110  80  80  75 130;...
      140 110  80  80  75 130 160 125 100 100  80 150;...
      160 125 100 100  80 150 190 150 130 inf inf inf;...
      190 150 130 inf inf inf 200 180 150 inf inf inf;...
      200 180 150 inf inf inf 100  80  50  50  60 100;...
      100  80  50  50  60 100 120  90  60  70  65 110;...
      120  90  60  70  65 110 140 110  80  80  75 130;...
      140 110  80  80  75 130 160 125 100 100  80 150;...
      160 125 100 100  80 150 190 150 130 inf inf inf;...
      190 150 130 inf inf inf 200 180 150 inf inf inf;...
      200 180 150 inf inf inf 100  80  50  50  60 100];

idxinf = find(delcosts == inf);
delcosts(idxinf) = 1e6;

buildcosts   = [3500 9000 10000 4000 3000 9000 9000 3000 4000 10000 9000 3500]';
capacity     = [ 300  250   100  180  275  300  200  220  270   250  230  180]';
demand       = [ 120   80    75  100  110  100   90   60   30   150   95  120]';

Prob = depotlocation(delcosts, buildcosts, capacity, demand, idxinf);

Result = tomRun('cplex', Prob, PriLev);

if PriLev > 1,
   c       = length(demand);                % number of customers
   d       = length(buildcosts);            % number of possible depots
   build   = find(Result.x_k(1:d)');        % the depots to build
   deliver = reshape(Result.x_k(d+1:c*d+d),c,d);
   deliver = deliver(:,build);
   deliver(find(deliver<0.001)) = 0;
   disp(['minimal total cost = ' num2str(Result.f_k) ])
   disp(['build the depots     ' num2str(build)      ])
   [jj,ii] = size(deliver);                 % ii = depots, jj = customers
   for j = 1:jj,
      disp(['let customer ' num2str(j) ' get '])
      for i = 1:ii,
         if deliver(j,i) ~= 0,
            if deliver(j,i) == 1,
               disp(['   all of its demand from depot ' num2str(build(i)) ])
            else
               disp(['   ' num2str(deliver(j,i)) ...
                     ' of its demand from depot ' num2str(build(i)) ])
            end
         end
      end
   end
end

% MODIFICATION LOG
%
% 051019 med   Created.
% 060112 per   Added documentation.
% 060125 per   Moved disp to end

Heating oil delivery

% function Result = heatingoildeliveryEx(PriLev)
%
% Creates a TOMLAB MIP problem for heating oil delivery
%
% HEATING OIL DELIVERY
%
% A transporter has to deliver heating oil from the refinery at
% Donges to a certain number of clients in the west of France. His
% clients are located at Brain-sur-l’Authion, Craquefou, Guérande, la
% Haie Fouassière, Mésanger and les Ponts-de-Cé. The following table
% lists the demands in liters for the different sites.
%
% Demands by clients (in liters)
%
% +-----------+-----+-----+-----+-----+
% | BslA| Craq| Guér| H Fo| Mésa| P dC|
% +-----+-----+-----+-----+-----+-----+
% |14000| 3000| 6000|16000|15000| 5000|
% +-----+-----+-----+-----+-----+-----+
%
% The next table contains the distance matrix between the clients and
% the refinery.
%
% Distance matrix (in km)
% +-------------------+----+----+----+----+----+----+----+
% |                   |Dong|BslA|Craq|Guér|H Fo|Mésa|P dC|
% +-------------------+----+----+----+----+----+----+----+
% |Donges             |   0| 148|  55|  32|  70| 140|  73|
% |Brain-s.-l’Authion | 148|   0|  93| 180|  99|  12|  72|
% |Craquefou          |  55|  93|   0|  85|  20|  83|  28|
% |Guérande           |  32|  80|  85|   0| 100| 174|  99|
% |Haie Fouassière    |  70|  99|  20| 100|   0|  85|  49|
% |Mésanger           | 140|  12|  83| 174|  85|   0|  73|
% |Ponts-de-Cé        |  73|  72|  28|  99|  49|  73|   0|
% +-------------------+----+----+----+----+----+----+----+
%
% The transport company uses tankers with a capacity of 39000 liters
% for the deliveries. Determine the tours for delivering to all
% clients that minimize the total number of kilometers driven.
%
% VARIABLES
%
% distance                   The distance matrix
% demand                     Demand
% capacity                   Capacity of tanker
%
% RESULTS
%
% Run this for an interpretation of the results
% Result = heatingoildeliveryEx(2);
%
% REFERENCES
%
% Applications of optimization... Gueret, Prins, Seveaux
% http://web.univ-ubs.fr/lester/~sevaux/pl/index.php
%
% INPUT PARAMETERS
% PriLev       Print Level
%
% OUTPUT PARAMETERS
% Result       Result structure.

% Marcus Edvall, Tomlab Optimization Inc, E-mail: tomlab@tomopt.com
% Copyright (c) 2005-2005 by Tomlab Optimization Inc., $Release: 5.0.0$
% Written Oct 20, 2005.   Last modified Oct 20, 2005.

function Result = heatingoildeliveryEx(PriLev)

if nargin < 1
   PriLev = 1;
end

distance     = [   0 148  55  32  70 140  73;...
      148   0  93 180  99  12  72;...
      55  93   0  85  20  83  28;...
      32 180  85   0 100 174  99;...
      70  99  20 100   0  85  49;...
      140  12  83 174  85   0  73;...
      73  72  28  99  49  73   0];

demand       = [14000;3000;6000;16000;15000;5000];
capacity     = 39000;

Prob = heatingoildelivery(distance, demand, capacity);

Result = tomRun('cplex', Prob, PriLev);

if PriLev > 1,
   s      = 7;                                         % number of sites
   names  = ['Dong'; 'BslA'; 'Craq'; 'Guér'; 'H Fo'; 'Mésa'; 'P dC'];
   tour   = reshape(Result.x_k(1:s*s),s,s);            % extract tour
   tour(find(tour<0.5)) = 0;                           % remove false zeros
   first  = find(tour(1,:));                           % might be an array
   disp(['min distance of ' num2str(Result.f_k) ' km by using'])

   for init = 1:length(first),                         % there might be many first stops
      this_tour = [names(1,:)];                        % start in Dong
      site = first(init);
      this_tour = [this_tour ' -> ' names(site,:)];    % add city 2
      loop_me = 1;
      next = find(tour(site,:));                       % what city is next?

      if next == 1,                                    % if we are going home:
         loop_me = 0;                                  % do not enter while-loop
         this_tour = [this_tour  ' -> ' names(1,:)];   % just add home and quit
         disp(['Tour ' num2str(init) ': ' num2str(this_tour) ])
      end

      while loop_me == 1,                              % if more than one stop
         this_tour = [this_tour  ' -> ' names(next,:)];% add them one at a time
         next = find(tour(next,:));

         if next == 1,                                  % when we are going home
            loop_me = 0;                                % stop loop
            this_tour = [this_tour  ' -> ' names(1,:)]; % finish names and quit
            disp(['  tour ' num2str(init) ': ' num2str(this_tour) ])
         end
      end
   end
end

% MODIFICATION LOG
%
% 051020 med   Created.
% 060112 per   Added documentation.
% 060125 per   Moved disp to end

Combining different modes of transport

% function Result = combiningdiffmodesoftranspEx(PriLev)
%
% Creates a TOMLAB MIP problem for combining different modes of transport
%
% COMBINING DIFFERENT MODES OF TRANSPORT
%
% A load of 20 tonnes needs to be transported on a route passing
% through five cities, with a choice of three different modes of
% transport: rail, road, and air. In any of the three intermediate
% cities it is possible to change the mode of transport but the load
% uses a single mode of transport between two consecutive cities.
% The following table lists the cost of transport in $ per tonne
% between the pairs of cities.
%
% Transport costs with different modes
%
%
%  Pairs of cities
% +----+---+---+---+---+
% |    |1–2|2–3|3–4|4–5|
% +----+---+---+---+---+
% |Rail| 30| 25| 40| 60|
% |Road| 25| 40| 45| 50|
% |Air | 40| 20| 50| 45|
% +----+---+---+---+---+
%
% The next table summarizes the costs for changing the mode of
% transport in $ per tonne. The cost is independent of location.
%
%
% Cost for changing the mode of transport
%
% +---------+----+----+---+
% |from \ to|Rail|Road|Air|
% +---------+----+----+---+
% |Rail     |  0 |  5 | 12|
% |Road     |  8 |  0 | 10|
% |Air      | 15 | 10 |  0|
% +---------+----+----+---+
%
% How should we organize the transport of the load at the least cost?
%
% VARIABLES
%
% transpcost                 Transport costs
% changecost                 Cost to change mode of transport
% demand                     Load to transport
%
% RESULTS
%
% For an interpretation of the results, try this:
% Result = combiningdiffmodesoftranspEx(2);
%
% REFERENCES
%
% Applications of optimization... Gueret, Prins, Seveaux
% http://web.univ-ubs.fr/lester/~sevaux/pl/index.php
%
% INPUT PARAMETERS
% PriLev       Print Level
%
% OUTPUT PARAMETERS
% Result       Result structure.

% Marcus Edvall, Tomlab Optimization Inc, E-mail: tomlab@tomopt.com
% Copyright (c) 2005-2005 by Tomlab Optimization Inc., $Release: 5.0.0$
% Written Oct 20, 2005.   Last modified Oct 20, 2005.

function Result = combiningdiffmodesoftranspEx(PriLev)

if nargin < 1
   PriLev = 1;
end

transpcost     = [ 30 25 40 60 ;...
      25 40 45 50 ;...
      40 20 50 45];

changecost     = [  0  5  12;...
      8  0  10;...
      15 10   0];

demand         = 30;

Prob = combiningdiffmodesoftransp(transpcost, changecost, demand);

Result = tomRun('cplex', Prob, PriLev);

if PriLev > 1,
   modes  = reshape(Result.x_k(1:3*4),3,4);
   means  = ['rail';'road';'air '];
   disp(['the min cost (' num2str(Result.f_k) ') is found by,'])
   for m = 1:size(modes,2),
      disp(['   going from town ' num2str(m) ' to town ' num2str(m+1) ...
            ' by ' means(find(modes(:,m)),:)])
   end
end

% MODIFICATION LOG
%
% 051020 med   Created.
% 060112 per   Added documentation.
% 060125 per   Moved disp to end

Fleet planning for vans

<source lang="matlab"> % function Result = fleetplanningforvansEx(PriLev) % % Creates a TOMLAB MIP problem for fleet planning for vans % % FLEET PLANNING FOR VANS % % A chain of department stores uses a fleet of vans rented from % different rental agencies. For the next six months period it has % forecast the following needs for vans (table below): % % Requirements for vans for six months % % +---+---+---+---+---+---+ % |Jan|Feb|Mar|Apr|May|Jun| % +---+---+---+---+---+---+ % |430|410|440|390|425|450| % +---+---+---+---+---+---+ % % At the 1st January, the chain has 200 vans, for which the rental % period terminates at the end of February. % % To satisfy its needs, the chain has a choice among three types of % contracts that may start the first day of every month: 3-months % contracts for a total cost of $1700 per van, 4-months contracts at % $2200 per van, and 5-months contracts at $2600 per van. How many % contracts of the different types need to be started every month in % order to satisfy the company’s needs at the least cost and to have % no remaining vans rented after the end of June? % % Running contracts in month 5 (May) ......... %  :  : % +-------:-------:-------+ % | Rent34:  : | % +-------+-------:-------:-------+ % | Rent33  :  : % +---------------:-------:-------+ % | Rent43  :  : | % +-------+---------------:-------:-------+ % | Rent42  :  : % +-----------------------:-------:-------+ % | Rent52  :  : | % +-------+-----------------------:-------:-------+ % | Rent51  :  : % +-------------------------------:-------: % . . .  :  : . % Month Jan  : Feb  : Mar  : Apr  : May  : Jun  : %  :.......:.......:.......:.......:  :.......: %  :.......: % % % VARIABLES % % demand Demand of vans per month % initialsupply Vans per month % contractlength Contracts available % contractcost Cost of contracts % % RESULTS % % To interpret the result, use PriLev > 1, for example: % Result = fleetplanningforvansEx(2); % % REFERENCES % % Applications of optimization... Gueret, Prins, Seveaux % http://web.univ-ubs.fr/lester/~sevaux/pl/index.php % % INPUT PARAMETERS % PriLev Print Level % % OUTPUT PARAMETERS % Result Result structure.

% Marcus Edvall, Tomlab Optimization Inc, E-mail: tomlab@tomopt.com % Copyright (c) 2005-2005 by Tomlab Optimization Inc., $Release: 5.0.0$ % Written Oct 21, 2005. Last modified Oct 21, 2005.

function Result = fleetplanningforvansEx(PriLev)

if nargin < 1

  PriLev = 1;

end

demand = [ 430; 410; 440; 390; 425; 450];

initialsupply = [ 200; 200; 0; 0; 0; 0];

contractlength = [ 3; 4; 5];

contractcost = [ 1700; 2200; 2600];

Prob = fleetplanningforvans(demand, initialsupply, contractlength, contractcost);

Result = tomRun('cplex', Prob, PriLev);

if PriLev > 1,

  months  = length(demand);
  c       = length(contractlength);
  temp   = reshape(Result.x_k,c,months);
  disp(['minimal cost of ' num2str(Result.f_k) ' by '])
  for m = 1:months,
     if sum(temp(:,m)) > 0,
        rent = find(temp(:,m));
        disp(['   renting ' num2str(temp(rent,m)) ' vans for ' ...
              num2str(contractlength(rent)) ' months in month ' num2str(m)])
     end
  end

end

% MODIFICATION LOG % % 051021 med Created. % 060112 per Added documentation. % 060125 per Moved disp to end