# Construction of a Cabled Network

## Problem description

A university wishes to connect six terminals located in different buildings of its campus. The distances, in meters, between the different terminals are given in the table below.

Distances between the different terminals (in meters)

```+----------+---+---+---+---+---+---+
|          | T1| T2| T3| T4| T5| T6|
+----------+---+---+---+---+---+---+
|Terminal 1|  0|120| 92|265|149|194|
|Terminal 2|120|  0|141|170| 93|164|
|Terminal 3| 92|141|  0|218|103|116|
|Terminal 4|265|170|218|  0|110|126|
|Terminal 5|149| 93|103|110|  0| 72|
|Terminal 6|194|164|116|126| 72|  0|
+----------+---+---+---+---+---+---+```

These terminals are to be connected via underground cables. We suppose the cost of connecting two terminals is proportional to the distance between them. Determine the connections to install to minimize the total cost.

## Variables

`distances                  a 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

```distances    = [  0 120  92 265 149 194;...
120   0 141 170  93 164;...
92 141   0 218 103 116;...
265 170 218   0 110 126;...
149  93 103 110   0  72;...
194 164 116 126  72   0];

s = size(distances, 1);
t = s;

connect = tom('connect',s,t,'int');
level   = tom('level',s,1);

% Some variables are binary.
bnds = {0 <= connect <= 1, level >= 0, connect(1:s+1:s^2) == 0};

% Terminal connections constraint
con1 = {sum(sum(connect)) <= s-1};

% At least one terminal connected to other
con2 = cell(s*t-s,1);
count = 1;
for i=1:s
for j=1:t
if i~=j
con2{count} = level(j) >= level(i) + 1 - s + s*connect(i,j);
count = count + 1;
end
end
end

% Anti-cycling constraint
con3 = {sum(connect(2:end,:),2) == 1};

% Objective
objective = sum(sum(distances.*connect));

constraints = {bnds, con1, con2, con3};
options = struct;
options.solver = 'cplex';
options.name   = 'Construction of a Cabled Network';
sol = ezsolve(objective,constraints,[],options);

PriLev = 1;
if PriLev > 0
t      = size(distances,1);    % number of terminals
s      = sum(1:t-1);           % possible connections
arcs   = [];                   % empty set of arcs
count  = 1;                    % counter
% we catch true arcs
[rows,cols] = find(sol.connect);
for i = 1:length(rows),
disp(['connect the terminals ' num2str(rows(i)) ' and ' num2str(cols(i)) ])
end
end

% MODIFICATION LOG
%
% 051122 med   Created
% 060116 per   Added documentation
% 060126 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: Construction of a Cabled Network  f_k     470.000000000000000000
f(x_0)      0.000000000000000000

Solver: CPLEX.  EXIT=0.  INFORM=101.
CPLEX Branch-and-Cut MIP solver
Optimal integer solution found

FuncEv   12
connect the terminals 3 and 1
connect the terminals 5 and 3
connect the terminals 2 and 5
connect the terminals 4 and 5
connect the terminals 6 and 5
```