the server placed at node $n\in{\mathcal{N}}$, expressed through variable $x(b,n)\in\{0,1\}$.

Note that none of the decision variables depends on the time step $t\in{\mathcal{T}}$; this reflects the fact that deployment decisions are made periodically, with a time period much longer than a single time step, accounting for the evolution of data demand over the previous period. Needless to say, we cannot serve anything on servers that do not exist, i.e., it must be: $$\nonumber
x(b,n)\leq y(n),\quad\forall b\in{\mathcal{B}},n\in{\mathcal{N}}.$$

The objective of the problem can be stated as deploying the smallest possible number of servers subject to delay constraints, i.e., $$\nonumber
\min_{x,y}\sum_{n\in{\mathcal{N}}}y(n).$$

\[line:input\] \[line:init\] \[line:while\] \[line:pairs1\] \[line:pairs2\] \[line:mindist\] \[line:call\]

\[line:consolidate1-begin\] \[line:consolidate1-end\] \[line:consolidate2-begin\] \[line:consolidate2-n3\] \[line:consolidate2-end\]

Optimally setting the binary $x$- and $y$-variables subject to constraints on the need to serve all traffic requires solving an ILP problem[^3], which is notoriously [@milp] impractical even for modestly-sized problem instances. We therefore devise a greedy design procedure, able to efficiently make good-quality deployment decisions.

### Greedy design procedure {#sec:algos}

Our greedy design procedure is inspired to hierarchical clustering and summarized in [Alg. \[alg:design\]]{}. It takes as input ([Line \[line:input\]]{}) the content category $k$ to consider, its maximum processing latency $L_{\max}$, its demand over time $\delta(b,k,t)$, and the 