Planning a Flight Tour
Contents
Problem description
A country in south-east Asia is experiencing widespread flooding. The government, with international help, decides to establish a system of supply by air. Unfortunately, only seven runways are still in a usable state, among which is the one in the capital.
The government decides to make the planes leave from the capital, have them visit all the other six airports and then come back to the capital. The following table lists the distances between the airports. Airport A1 is the one in the capital. In which order should the airports be visited to minimize the total distance covered?
Distance matrix between airports (in km)
+--+---+---+---+---+---+---+ | | A2| A3| A4| A5| A6| A7| +--+---+---+---+---+---+---+ |A1|786|549|657|331|559|250| |A2|668|979|593|224|905| | |A3|316|607|472|467| | | |A4|890|769|400| | | | |A5|386|559| | | | | |A6|681| | | | | | +--+---+---+---+---+---+---+
Variables
distance The distance matrix
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
distance = [ 0 786 549 657 331 559 250;... 786 0 668 979 593 224 905;... 549 668 0 316 607 472 467;... 657 979 316 0 890 769 400;... 331 593 607 890 0 386 559;... 559 224 472 769 386 0 681;... 250 905 467 400 559 681 0]; n = size(distance,1); fly = tom('fly',n,n,'int'); % All variables are binary. bnds = {0 <= fly <= 1, fly(1:n+1:n^2) == 0}; % Cycle constraints con = {sum(fly,1) == 1; sum(fly,2) == 1}; % Objective objective = sum(sum(distance.*fly)); constraints = {bnds, con}; options = struct; options.solver = 'cplex'; options.name = 'Planning a Flight Tour'; stop = 0; while stop<100 sol = ezsolve(objective,constraints,[],options); % Find a subtour idx = zeros(n,n); idx(1,1:n) = 1:7; for i=1:n for j=2:n idx(j,i) = find(sol.fly(:,idx(j-1,i)) ~= 0); if idx(j,i) == i break end end end shortmat = spones(idx); len = full(sum(shortmat,1)); [val, idx2] = min(len); idx3 = idx(1:val, idx2); idx4 = zeros(val-1,1); for k=1:val-1 idx4(k) = idx3(k)+n*(idx3(k+1)-1); end constraints = {constraints; sum(fly(idx4)) <= 1}; if val == n break end stop = stop + 1; end PriLev = 1; if PriLev > 0 temp = sol.fly; % reshape results not_home_again = true; % help to loop current_pos = 1; % we start in 1 route = []; % initially empty route = [route current_pos]; % add position while not_home_again, % loop if not home current_pos = find(temp(current_pos,:)); % go to next pos route = [route current_pos]; % add to route if current_pos == 1 % if home not_home_again = false; % stop loop end end disp(['Shortest route is: ' num2str(route)]) disp([' or: ' num2str(route(end:-1:1))]) end % MODIFICATION LOG % % 051107 med Created. % 060116 per Added documentation. % 060125 per Moved disp to end % 090308 med Converted to tomSym
Problem type appears to be: mip ===== * * * =================================================================== * * * TOMLAB - Tomlab Optimization Inc. Development license 999001. Valid to 2010-02-05 ===================================================================================== Problem: --- 1: Planning a Flight Tour f_k 2220.000000000000000000 f(x_0) 0.000000000000000000 Solver: CPLEX. EXIT=0. INFORM=101. CPLEX Branch-and-Cut MIP solver Optimal integer solution found FuncEv 12 Problem type appears to be: mip ===== * * * =================================================================== * * * TOMLAB - Tomlab Optimization Inc. Development license 999001. Valid to 2010-02-05 ===================================================================================== Problem: --- 1: Planning a Flight Tour f_k 2335.000000000000000000 f(x_0) 0.000000000000000000 Solver: CPLEX. EXIT=0. INFORM=101. CPLEX Branch-and-Cut MIP solver Optimal integer solution found FuncEv 11 Problem type appears to be: mip ===== * * * =================================================================== * * * TOMLAB - Tomlab Optimization Inc. Development license 999001. Valid to 2010-02-05 ===================================================================================== Problem: --- 1: Planning a Flight Tour f_k 2575.000000000000000000 f(x_0) 0.000000000000000000 Solver: CPLEX. EXIT=0. INFORM=101. CPLEX Branch-and-Cut MIP solver Optimal integer solution found FuncEv 15 Shortest route is: 1 7 4 3 2 6 5 1 or: 1 5 6 2 3 4 7 1