Salta al contenuto
Mensile · dati aperti Rivista di ottimizzazione applicata Scrivici ↗
Caso N. 001 Salute pubblica

DefiBrilliamo Bologna

Bologna sa esattamente dove sono i suoi 263 DAE pubblici, caso raro. Abbiamo costruito un modello di copertura che dice dove mettere i prossimi venti. Spoiler: non in centro.

Raffaele Direnzo 16 luglio 2026 8 min di lettura
Metodo
Maximal Covering Location Problem (MCLP) incrementale
Strumenti
Python, PuLP, HiGHS
Risultato
+72.091 — residenti entro 300 m da un DAE, con 20 apparecchi in più

Quando un cuore si ferma per strada, la partita si gioca in minuti: ogni minuto senza defibrillazione porta via il 7–10% delle probabilità di sopravvivere. Per questo le città disseminano defibrillatori pubblici (DAE) in negozi, scuole, palestre. La domanda scomoda, però, è un’altra: sono nei posti giusti? Di solito non si può nemmeno rispondere, perché nessuno sa con precisione dove siano gli apparecchi esistenti. Bologna è un’eccezione: il registro comunale dei DAE è open data, completo e georeferenziato — 263 apparecchi con le loro coordinate ufficiali. E allora i conti, per una volta, si possono fare sul serio.

Prova a indovinare

Oggi il 54,8% dei bolognesi abita entro 300 metri da un DAE pubblico. Quante persone in più si coprono aggiungendo 20 apparecchi nei posti giusti?

Prova a dire un numero

72.091

Dieci volte quello che ottengono gli stessi venti apparecchi piazzati a caso: il valore non sta nell'hardware, sta nelle coordinate.

01La sfida

Le regole del gioco: i 263 apparecchi restano dove sono, se ne possono solo aggiungere venti — un aumento della rete di meno dell’otto per cento. Un residente conta come «coperto» se abita entro 300 metri da un DAE: un minuto di corsa ad andare e uno a tornare, la soglia più usata negli studi sul tema. La città è divisa in una griglia di celle da 250 metri (2.253 caselle): il modello sceglie le zone, mentre il punto esatto — una farmacia, un’edicola, l’ingresso di una scuola — resta a chi installa. Obiettivo: massimizzare i residenti coperti in più. Oggi lo è il 54,8%, cioè 213.556 persone su 389.478: le altre 175.922 abitano a più di trecento metri dall’apparecchio più vicino.

02Gli ingredienti

Cinque dataset, tutti aperti: quattro dal portale open data del Comune di Bologna e uno dall’ISTAT.

  • Il registro DAE (progetto-dae): 263 apparecchi georeferenziati, fotografia di luglio 2026. È il registro ufficiale, non una stima ricostruita dal crowdsourcing.
  • Le sezioni di censimento: le 2.606 tessere in cui è divisa la città, ognuna col suo centroide.
  • La popolazione ISTAT del censimento permanente 2023, sezione per sezione — il dato più fine pubblicato in Italia: nel cuore della città una sezione è spesso un singolo isolato.
  • Le aree statistiche: i 90 quartieri statistici, usati per costruire la griglia dei candidati e per raccontare i risultati.

La finezza del dato non è un vezzo: rifacendo tutti i conti con la stessa popolazione spalmata uniformemente sui quartieri, il guadagno ottimo cala del 12% e 15 dei 20 siti scelti cambiano posto. Sapere dove abita la gente, isolato per isolato, è metà del risultato.

03Il verdetto

DAE registrati oggi263
Copertura oggi54,8%
Copertura con +2073,3%
Residenti guadagnati+72.091entro 300 m da un DAE

La curva della copertura

Residenti entro 300 m da un DAE al crescere del numero di nuovi apparecchi (ognuno un modello risolto all'ottimo)

0,025,050,075,0100,0 %Oggi+5+10+15+20+25+30+40+50
Vedi i dati in tabella (%)
Copertura
Oggi54,8
+561,3
+1065,9
+1570,0
+2073,3
+2576,3
+3079,0
+4083,4
+5086,9

I primi 5 apparecchi coprono oltre 5.000 persone ciascuno; oltre i 40, circa 1.400.

Elaborazione su open data del Comune di Bologna e censimento ISTAT 2023

I primi apparecchi valgono oro — i primi cinque coprono più di cinquemila persone l’uno — poi la curva si piega: è la firma di ogni buon problema di copertura, e regala a chi decide una regola d’arresto onesta: si allarga il budget finché il guadagno marginale giustifica il costo di installare e mantenere un apparecchio.

La notizia vera, però, è dove finiscono i venti nuovi siti: tutti fuori dal centro storico, il più vicino a un chilometro e mezzo da Piazza Maggiore. In testa alla classifica dei quartieri scoperti ci sono San Savino (9.138 residenti oltre i 300 metri), Arcoveggio (8.635), Via Toscana (8.150), Bitone (7.120) e Cirenaica (6.150): non frange remote, ma quartieri residenziali densi e ordinari. La spiegazione è semplice: storicamente i DAE vanno dove stanno le istituzioni — scuole, impianti sportivi, sedi comunali — e le istituzioni si concentrano in centro. La popolazione no.

I defibrillatori seguono le istituzioni, le persone no. Un modello di copertura pesato sulla popolazione corregge esattamente questo vizio.

C’è anche un’eccezione istruttiva: il Pilastro, quartiere popolare della periferia est con 3.652 residenti scoperti, a quota venti apparecchi non riceve nulla. La sua popolazione scoperta è troppo sparsa perché un solo cerchio da 300 metri ne catturi abbastanza, così il budget scivola verso sacche più dense. È la logica dell’efficienza resa visibile: il modello massimizza la copertura totale, non l’equità fra quartieri. Chi vuole servire prima i quartieri peggio messi può aggiungere vincoli di equità — una copertura minima per quartiere — pagando un prezzo misurabile in copertura complessiva.

04Il posto o l’apparecchio?

Obiezione legittima: venti DAE in più migliorano la copertura comunque, che li si ottimizzi o no. Per misurarlo abbiamo tirato i dadi: 4.000 piazzamenti casuali dei venti apparecchi, valutati con le stesse identiche regole dell’ottimo.

Venti apparecchi, quattro modi di piazzarli

Residenti coperti in più rispetto a oggi; per i piazzamenti a caso, media su 2.000 estrazioni

020.00040.00060.00080.000A caso in città6.980A caso, zone utili10.602Migliore su 4.00030.619Scelti dal modello72.091
Vedi i dati in tabella
Residenti coperti in più
A caso in città6.980
A caso, zone utili10.602
Migliore su 4.00030.619
Scelti dal modello72.091

Anche il colpo di fortuna migliore su 4.000 si ferma a due quinti dell'ottimo.

Benchmark Monte Carlo, 2.000 estrazioni per politica

Il piazzamento casuale medio copre 6.980 persone, l’ottimo 72.091: dieci volte tanto. E il colpo più fortunato su quattromila tentativi arriva appena a 30.619, due quinti di quello che gli stessi venti apparecchi rendono quando a piazzarli è il modello. Qui l’ottimizzazione non è la rifinitura finale: è la maggior parte del valore.

E se il budget fosse diverso?

Sposta il cursore: ogni posizione è un modello risolto all'ottimo dimostrato.

Nuovi DAE+20
Copertura dei residenti73,3%

+72.091 residenti — lo scenario di questo caso

Tutti gli scenari in tabella
Nuovi DAECopertura dei residenti
+561,3%+25.140 residenti — oltre 5.000 per apparecchio
+1065,9%+43.203 residenti
+1570,0%+59.137 residenti
+2073,3%+72.091 residenti — lo scenario di questo caso
+2576,3%+83.650 residenti
+3079,0%+93.945 residenti
+4083,4%+111.130 residenti
+5086,9%+124.812 residenti — il resto è collina a bassa densità
Il modello, per chi vuole la matematica

È un Maximal Covering Location Problem (Church e ReVelle, 1974) in versione incrementale: la rete esistente non entra come vincolo ma come pre-elaborazione. Le sezioni già coperte dai 263 apparecchi si tolgono dal problema (contribuirebbero solo una costante), e restano 1.057 sezioni scoperte con 175.922 residenti e 1.453 celle candidate utili. La riduzione è esatta: le soluzioni ottime coincidono con quelle del modello completo.

max   Σi wi · zi
  t.c.   zi ≤ Σj ∈ N(i) xj    per ogni sezione i
         Σj xj = k,    xj ∈ {0,1},    0 ≤ zi ≤ 1

dove wi sono i residenti della sezione i e N(i) le celle a meno di 300 metri dal suo centroide. Le z possono restare continue: con obiettivo massimizzante e pesi positivi salgono da sole a valori interi all’ottimo. In PuLP:

import pulp

m = pulp.LpProblem("dae_incrementale", pulp.LpMaximize)
x = {j: pulp.LpVariable(f"x_{j}", cat="Binary") for j in candidati}
z = {i: pulp.LpVariable(f"z_{i}", lowBound=0, upBound=1) for i in sezioni}

m += pulp.lpSum(residenti[i] * z[i] for i in sezioni)
for i in sezioni:
    m += z[i] <= pulp.lpSum(x[j] for j in vicini[i])
m += pulp.lpSum(x.values()) == 20

m.solve(pulp.HiGHS())

Con 1.453 variabili binarie è un MILP piccolo: HiGHS, solutore open source, risolve all’ottimo dimostrato tutta la curva degli otto scenari in una ventina di secondi su un portatile. Script, dati e figure sono nel repository del caso su GitHub: ogni numero dell’articolo si rigenera da fonti pubbliche.

05Dove il gioco finisce

La domanda del modello è la popolazione residente, non gli arresti cardiaci veri: i dati georeferenziati degli eventi non sono aperti, e i luoghi ad alto passaggio — stazioni, stadi, centri commerciali — meritano un ragionamento a parte. I 263 apparecchi sono contati tutti come sempre disponibili, mentre alcuni stanno al chiuso con orari: è un’ipotesi ottimista, e filtrare i soli h24 abbasserebbe la base di partenza alzando il valore dei nuovi siti. I 300 metri sono in linea d’aria, non lungo le strade; le celle scelte sono zone, non siti chiavi in mano; la popolazione è quella del censimento 2023 contro un registro del 2026. E la copertura totale resta fuori portata: persino cinquanta apparecchi ottimi si fermano a quota 86,9%, perché su colli e frange rurali la densità è troppo bassa per la copertura di prossimità — lì funzionano meglio le app dei primi soccorritori o i DAE a bordo dei mezzi. Niente di tutto questo scalfisce il punto centrale: misurata sul registro ufficiale, la rete bolognese guarda al centro, e una ventina di apparecchi ben mirati vale più di quanto il loro numero lasci credere.