Combining different modes of transport
Contents
Problem description
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
References
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 11, 2009.
Problem setup
transpcost = tomArray([ 30 25 40 60 ;... 25 40 45 50 ;... 40 20 50 45]); changecost = tomArray([ 0 5 12;... 8 0 10;... 15 10 0]); demand = 30; m = size(changecost,1); % mode l = size(transpcost,2); % legs n = size(changecost,2); % mode i = tomArrayIdx('i',1:m); % index over all modes to change from j = tomArrayIdx('j',1:l); % index over all legs jc = tomArrayIdx('jc',1:l-1); % index over all legs that involve a change k = tomArrayIdx('k',1:n); % index over all modes to chang to change = tom('change',m*n*(l-1),1,'int'); change = tomArray(change,[m,n,l-1]); use = tom('use', m*l, 1, 'int'); use = tomArray(use,[m,l]); % All variables are binary. bnds = {0 <= change <= 1, 0 <= use <= 1}; % Single mode of transport con1 = {sum(use(i,j),i) == 1}; % Single change of mode con2 = {sum(sum(change(i,k,jc),i),k) == 1}; % Change to mode relationship con3 = use(i,jc) + use(k,jc+1) >= 2*change(i,k,jc); % Objective objective = sum(vec(transpcost(i,j).*use(i,j))) + ... sum(vec(changecost(i,k).*change(i,k,jc))); constraints = {bnds, con1, con2, con3}; options = struct; options.solver = 'cplex'; options.name = 'Combining Diff Modes of Transp'; [sol, Result] = ezsolve(objective,constraints,[],options); PriLev = 1; if PriLev > 0 modes = reshape(sol.use,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 % 090407 med Converted to tomSym
Problem type appears to be: mip Starting numeric solver ===== * * * =================================================================== * * * TOMLAB - Tomlab Optimization Inc. Development license 999001. Valid to 2010-02-05 ===================================================================================== Problem: --- 1: Combining Diff Modes of Transp f_k 150.000000000000000000 f(x_0) 0.000000000000000000 Solver: CPLEX. EXIT=0. INFORM=101. CPLEX Branch-and-Cut MIP solver Optimal integer solution found FuncEv 20 CPU time: 0.156250 sec. Elapsed time: 0.156000 sec. the min cost (150) is found by, going from town 1 to town 2 by rail going from town 2 to town 3 by rail going from town 3 to town 4 by rail going from town 4 to town 5 by road