Contrôle Classant d'Informatique

Promotion 1998

Sujet proposé par Robert Cori et François Morain

26 janvier 2000





Les téléphones mobiles sont partout. Avec eux sont arrivés des problèmes algorithmiques rendus plus complexes en raison du grand nombre de clients à satisfaire en même temps. Le problème est consacré à quelques questions inspirées par la gestion de réseaux de mobiles.

La partie I comporte surtout de la programmation. Les parties II et III du problème sont indépendantes de la partie I. La partie III reprend la problématique de la partie II.

Un réseau de téléphones mobiles est constitué de régions, chacune pouvant gérer un grand nombre de mobiles. L'ordinateur central du réseau a pour tâche de trouver la région contenant un mobile de numéro donné, ce qui permet de mettre en communication le mobile et l'appelant. On s'interessera dans la première partie à la gestion des mobiles dans une région et dans les deuxièmes et troisièmes parties aux communications entre les régions.

I. Gestion de la localisation

Une région est assimilée à une partie du plan euclidien. Chaque région contient une balise fixe permettant d'émettre et de recevoir des messages pour les mobiles présents dans la région.

Un mobile est repéré par son numéro de téléphone (qu'on suppose être un entier), ainsi que par ses coordonnées (x, y) qui sont entières. Il s'agit en fait de la position du mobile dans un quadrillage relativement large.

À une région donnée est associée une liste des mobiles qui s'y trouvent. Chaque cellule de la liste contient le numéro d'un mobile, ses coordonnées et l'adresse de la cellule suivante. Ceci est déclaré par une classe Java, à l'intérieur de laquelle sont incluses les méthodes demandées dans les questions 1, 2, 3, 4.
class ListeM{
   int xm, ym;
   int num;
   ListeM suiv;

   ListeM(ListeM l, int x, int y, int n){
        xm = x; ym = y; num = n; suiv = l;
   }
}
La distance entre deux mobiles M1 de cooordonnées (x1, y1) et M2 de coordonnées (x2, y2) sera calculée par la formule d(M1, M2) = |x2-x1|+|y2-y1| (on montre que c'est bien une distance) où |z| désigne la valeur absolue. Dans la suite on note N le nombre de mobiles présents dans la région.

Question 1.
a) Écrire une méthode :
static int distance(int x1, int y1, int x2, int y2)
qui calcule la quantité |x2-x1|+|y2-y1|. On rappelle que la valeur absolue d'un entier s'obtient en Java au moyen de la fonction Math.abs.

b) Écrire une méthode :
static ListeM estDansListe(ListeM lm, int num)
qui renvoie (sans copie) la fin de la liste lm commençant par le mobile de numéro num si celui-ci figure dans la liste et null sinon.

c) Écrire une méthode :
static int distanceM(ListeM lm, int num1, int num2)
qui calcule la distance de deux mobiles présents dans la région et donnés par leurs numéros.

Question 2.
a) Écrire une méthode :
static int plusPetiteDistance(ListeM lm, int x, int y) 
qui renvoie la plus petite distance (au sens de la distance d) entre un mobile de lm et le point (x, y).

b) Écrire une méthode :
static ListeM plusProches(ListeM lm, int x, int y) 
qui renvoie la liste des mobiles les plus proches du point (x, y).

On suppose maintenant qu'une région est découpée en sous-ensembles de taille plus petite. Chaque sous-ensemble est représenté par la liste des mobiles qu'il contient. Une région est donc représentée par un tableau de taille RMAX dont chaque élément est une liste de mobiles. Il est déclaré et initialisé par
ListeM[] reg = new ListeM[RMAX];
On suppose donnée une fonction h qui à tout numéro de téléphone associe le numéro du sous-ensemble qui le contient. Ainsi deux mobiles de numéro n1 et n2 sont dans le même sous-ensemble si et seulement si h(n1)= h(n2). On supposera cette fonction réalisée par une méthode donnée h, qui opère en temps constant :
static int h(int numero){ ... }
Question 3.
a) Écrire une méthode
static int distanceM2(ListeM[] reg, int num1, int num2) 
calculant la distance entre deux mobiles donnés par leurs numéros avec cette nouvelle structure de données.

b) Donner une méthode
static ListeM plusProches2(ListeM[] reg, int x, int y) 
qui renvoie la liste des mobiles les plus proches d'un point donné.

c) Gagne-t-on en efficacité dans ces méthodes grâce à cette nouvelle structure de données? On supposera que le nombre de mobiles dans chaque sous-ensemble est petit par rapport au nombre total de mobiles N.

Question 4.
Suite à un accroissement du nombre de mobiles dans une région, on décide de couper celle-ci en deux, en installant une nouvelle balise aux coordonnées (xb, yb). La nouvelle balise prendra en charge les mobiles plus proches (au sens strict) d'elle que de la balise initiale de coordonnées (xa, ya). Donner une méthode
static void divise(ListeM[] rega, ListeM[] regb, ListeM[] reg,
                   int xa, int ya, int xb, int yb) 
de complexité linéaire en N permettant d'accomplir cette tâche, dans le cas où on utilise une gestion par sous-ensembles comme dans la question précédente. Cette méthode remplit les régions rega et regb à partir de reg.

II. Attribution de fréquences

On considère dans cette partie les communications entre les balises figurant au centre de chaque région. Celles-ci émettent chacune sur une certaine fréquence. Deux balises voisines ne peuvent émettre sur la même fréquence en raison des interférences. On s'intéresse à des algorithmes d'attribution de fréquences satisfaisant cette contrainte.

On modélise un réseau par un graphe G=(B, V) où B est un ensemble de balises et V l'ensemble des arêtes. Deux balises sont liées par une arête si et seulement si elles peuvent émettre l'une vers l'autre. Le graphe est symétrique (non orienté) : si la balise i émet vers j alors j peut émettre vers i.

On appelle étiquetage du graphe G une application j de B dans N telle que deux balises voisines ont une image différente par j . On note N(j ) le nombre de fréquences qu'elle utilise, c'est-à-dire le cardinal de l'image de j dans N. Dans la pratique, il est important de chercher à minimiser ce nombre. Le nombre minimal de fréquences nécessaires pour étiqueter un graphe sera noté n(G).

À titre d'exemple, le graphe suivant est étiqueté :



On a mis pour chaque balise la fréquence associée.

Question 5.
Déterminer le nombre n(G) pour les graphes suivants en exhibant un étiquetage convenable.



Le degré d'une balise bÎ B est le nombre de balises voisines de b dans G ; on le note deg(b). Le degré du graphe G est le maximum des degrés des balises ; on le note D(G).

On se propose d'étudier l'algorithme naïf d'étiquetage suivant. On considère un ordre sur les balises et on étiquette le graphe de proche en proche en suivant cet ordre : on définit j (b) comme étant la plus petite des fréquences non utilisées dans l'étiquetage des balises voisines de b et la précédant dans l'ordre.

Question 6.
a) Montrer que n(G) £ D(G)+1.

b) On appelle clique de G un sous-ensemble de balises tels que deux quelconques d'entre elles soient voisines. Par exemple, les balises du tétraèdre central du graphe 3 forment une clique à 4 éléments. On note w(G) la taille (c'est-à-dire le nombre de balises) de la plus grande clique de G. Comment se comparent n(G) et w(G) ?

c) Pour tout n, donner un exemple de graphe connexe à n sommets où la borne supérieure D(G)+1 est atteinte. Pour quelles valeurs de n existe-t-il un graphe connexe G tel que D(G) = 2 et n(G)=3 ?

Question 7.
On considère le graphe Gn ayant 2n balises B = {b0, b1, ... , bn-1, c0, c1, ... , cn-1} et tel que les voisins de bi sont tous les cj satisfaisant j ¹ i.

a) Quelles sont les fréquences attribuées par l'algorithme naïf, si les balises sont considérées dans l'ordre :
b0, c0, b1, c1, ... , bi, ci, bi + 1, ... , bn-1, cn-1.

b) Quelle est la valeur de n(Gn) ?

À partir de maintenant, on suppose que B est représenté par l'ensemble des entiers {0, 1, ..., n-1}. La classe Graphe est alors définie par :

class Graphe{
    int n;
    Liste[] vois;
    int[] freq;
...
}
vois[i] contient la liste des numéros des balises voisines de i. La classe Liste implante une liste d'entiers, comme dans le cours. On pourra utiliser les primitives classiques associées à cette classe.

Question 8.
Donner la méthode

static void naif(Graphe G)
qui réalise l'algorithme naïf d'attribution de fréquences avec l'ordre usuel 0 < 1 < 2 < ... < n-1. Si m est le nombre d'arêtes du graphe G et k le nombre de fréquences utilisées, on veut que cette méthode soit de coût O(k n + m).

Question 9.
On suppose que les balises se trouvent toutes sur une même droite du plan euclidien. À chaque balise b est associée un intervalle Ib = [xb, xb'] qui représente la zone d'influence de b, c'est-à-dire que b peut émettre vers tout mobile présent dans cet intervalle. Deux balises sont voisines si et seulement si leurs intervalles ont une intersection non vide.

a) Dessiner le graphe G des quatre balises a, b, c, d ayant pour intervalles respectifs : [1, 3], [2, 5], [6, 8], [4, 7]. Donner un ordre de parcours sur les balises tel que l'algorithme naïf attribue trois fréquences à G. Que vaut n(G) ?

b) On applique l'algorithme naïf en considérant les balises dans l'ordre croissant des xb. Montrer que si le nombre de fréquences attribuées est k, alors le graphe G possède une clique de taille k. En déduire que dans ce cas l'algorithme naïf donne l'attribution optimal de fréquences.

c) On se place dans un modèle à deux dimensions. Ainsi chaque balise peut émettre dans un rectangle [xb, xb'] × [yb, yb']. Deux balises sont voisines si leurs rectangles se coupent. Utiliser l'exemple donné ci-dessus pour montrer que l'algorithme naïf qui considère les balises dans l'ordre des xb croissant ne donne pas l'attribution optimale de fréquences.

III. Amélioration de l'étiquetage

Dans cette partie, on s'intéresse à quelques techniques permettant de diminuer le nombre de fréquences attribuées par l'algorithme naïf.

Soit G un graphe : on dit que la balise c est accessible depuis la balise b s'il existe un chemin entre b et c dans le graphe. Soient f1 et f2 deux fréquences distinctes de balises. On note H(f1, f2) le sous-graphe de G dont les balises sont toutes celles ayant une fréquence égale à f1 ou f2. Pour une balise b de fréquence f1, ou f2 on note Hb(f1, f2) la composante de H(f1, f2) contenant b et les balises accessibles à partir de b dans le graphe H(f1, f2).

On utilise le principe suivant. Soient b et c deux balises de fréquences distinctes respectives f1 et f2. On dit que b et c sont égalisables si et seulement si c n'est pas dans Hb(f1, f2). Dans ce cas, on peut en effet échanger les fréquences dans Hb(f1, f2) sans que l'étiquetage de G devienne invalide.

Question 10.
Écrire une méthode
static void echangerFreq(Graphe G, int b, int f1, int f2)
qui échange les fréquences f1 et f2 dans la composante Hb(f1, f2) pour b donnée de fréquence f1.

On modifie l'algorithme naïf de la façon suivante :

Lors de chaque étape, avant d'attribuer à b une fréquence nouvelle (i.e., non attribuée à une autre balise avant b) on examine si elle admet un couple de voisins égalisables, et dans ce cas on effectue l'échange des fréquences sur l'une des composantes.

Question 11.
a) Montrer sur le graphe Gn que cette nouvelle version de l'algorithme donne, avec le même ordre des balises que celui considéré plus haut, un bien meilleur résultat.

b) Écrire la nouvelle version de l'algorithme sous forme d'une méthode :
static void naifAmeliore(Graphe G)
de complexité O(n D(G)2).

Question 12.
Soit G un graphe dont le maximum des degrés des sommets est D. On suppose avoir étiqueté toutes les balises avant la balise b avec les D fréquences 0, 1, ..., D-1. On suppose que b a D voisines ayant des fréquences distinctes 0, 1, ..., D-1 et qu'il existe une balise c déjà considérée, accessible depuis b, et dont les voisines sont étiquetées avec strictement moins de D-1 fréquences. Montrer qu'on peut étiqueter b avec une fréquence <D.

On suppose dans la suite du problème que le graphe G est D-régulier, c'est-à-dire que toutes les balises ont degré D.

Pour deux balises b1 et b2 reliées par un chemin ne contenant que des balises de fréquence f1=j (b1) et f2=j (b2), on note F(b1, b2) = Hb1(j (b1), j (b2)) la composante du graphe formée des balises de fréquence f1 ou f2.

Question 13.
On se propose de modifier encore l'algorithme naïf afin d'égaliser deux voisines bi et bj d'une balise b, ce qui permettra de récupérer à chaque fois une fréquence pour b. Pour cela on change la valeur de la fréquence de certains sommets, en utilisant une fréquence déjà attribuée. Montrer que cela est possible dans chacun des deux cas suivants.

a) Les voisines de b ont toutes des fréquences différentes et deux d'entre celles-ci b1 et b2 forment une composante F(b1, b2) qui contient une balise ayant 3 voisines dans la composante.

b) Les voisines de b ont toutes des fréquences différentes et trois d'entre celles-ci b1, b2, b3 sont telles que F(b1, b2) et F(b1, b3) ont une balise commune autre que b1.

Question 14.
Montrer que l'on peut rendre égalisables deux voisines b1 et b2 d'une balise b qui ne sont pas voisines entre elles dans le cas où il existe une troisième voisine b3 telle que F(b1, b2), F(b1, b3), et F(b3, b2) n'ont deux à deux aucune balise commune (autre que b1, b2, b3).

Question 15.
En déduire une preuve du résultat théorique suivant : tout graphe G qui n'est pas une clique et tel que D(G) > 2 satisfait n(G) £ D(G).




This document was translated from LATEX by HEVEA.