Dans une ville on place des antennes GSM. Ces antennes sont plus ou moins puissantes et elles sont placées au gré des accords avec les résidents des immeubles où elles sont implantées. Elles ne sont donc pas placées avec la régularité d'un quadrillage. De plus, on peut être amené à placer plus d'antennes dans les zones de forte affluence.
Nous disposons des données concernant les antennes. En voici un aperçu – 10 premières lignes :
| ID | PORTEE | LAT | LON |
|---|---|---|---|
| ANT7271 | 50 | 48.802757 | 2.372187 |
| ANT1747 | 50 | 48.797364 | 2.360350 |
| ANT9084 | 50 | 48.797359 | 2.372168 |
| ANT6633 | 50 | 48.798027 | 2.372778 |
| ANT1810 | 50 | 48.796001 | 2.363910 |
| ANT1920 | 100 | 48.803417 | 2.353819 |
| ANT9785 | 100 | 48.797364 | 2.355624 |
| ANT2717 | 50 | 48.814234 | 2.353869 |
| ANT5168 | 50 | 48.808151 | 2.367458 |
| ANT6021 | 100 | 48.808162 | 2.360334 |
Téléchargez : antennes.csv
Le fichier indique, pour chaque antenne, sa localisation en latitude et longitude, sa portée et un identifiant.
Le calcul de la distance entre deux points, tenant compte des positions en latitude et longitude, relève d'un calcul de trigonométrie. Je vous donne la formule, avec les latitudes et longitudes exprimées en degrés :
$$x = (longitude_1 - longitude_2)\cdot\cos\left(\frac{latitude_1 + latitude_2}{2}\cdot \frac{2\pi}{360}\right) \cdot 111\,120$$ $$y = (latitude_1 - latitude_2) \cdot 111\,120$$ $$distance = \sqrt{x^2 + y^2}$$
$111\,120 = 60 \times 1852$. Le mile nautique, $1852 m$, unité de distance pour les marins, est définie comme la longueur correspondant à 1 minute d'angle au niveau de l'équateur. Il faut 60 minutes pour faire un degré, donc 1 degré à l'équateur correspond à la distance $60 \times 1852 m$.
Les antennes disposent d'un ensemble de fréquences pour communiquer. Certaines zones sont couvertes par plusieurs antennes en même temps et il faut alors que ces antennes aient une fréquence différente afin d'éviter les interférences.
On aimerait limiter le nombre de fréquences utilisées.
On cherche donc à attribuer une fréquence à chaque antenne, en choisissant une fréquence différente pour deux antennes couvrant une même zone, mais en limitant le nombre de fréquences utilisées.
C'est un problème de coloration de graphe.
Écrire un programme Python qui :
antennes.csv et en extrait les données,antennes.out.csv dans lequel on aura une colonne FREQ supplémentaire, indiquant une fréquence pour chaque antenne.Vous pouvez ajouter – en guise de divertissement – une représentation graphique montrant les différentes antennes avec leur couleurs. Pour cela,
$$x = longitude \cdot\cos\left(latitude\cdot \frac{2\pi}{360}\right) \cdot 111\,120$$ $$y = latitude \cdot 111\,120$$
x, une liste de y, on a déjà une liste de fréquences f et une liste de portées p.Le code est alors :
import matplotlib.pyplot as plt plt.scatter(x,y, c=f, s=p) # supposant les list x, y, f, p définies préalablement plt.show()