• Aucun résultat trouvé

slides

N/A
N/A
Protected

Academic year: 2022

Partager "slides"

Copied!
25
0
0

Texte intégral

(1)

Problème d’énumération des parties d’un ensemble

Jean-Marc Vincent1

1 Laboratoire LIG Équipe-Projet POLARIS [email protected]

1 LE PROBLÈME: énumérer toutes les parties d’un ensemble

2 ALGORITHME: énumération récursive

3 PREUVE: structure de preuve d’algorithme récursif

4 COMPLEXITÉ

(2)

PROBLÈME ALGORITHME PREUVE COMPLEXITÉ EXERCICES

M OTIVATIONS

Algorithme de recherche

I Trouver toutes les manières de placernreines sur un échiquier sans qu’elles soient en prise.

I Dans un sac à dos charger un ensemble des objets ayant une valeur totale maximale (contrainte de volume)

I Trouver les configurations du jeu Tic-Tac-Toe

I Trouver les k-coloriages d’un graphe

I etc

Ci=xi1∨xi2∨ · · · ∨xiki, négation.

I Forme normale conjonctive Problème de la classeNP

(3)

M OTIVATIONS

Algorithme de recherche

I Trouver toutes les manières de placernreines sur un échiquier sans qu’elles soient en prise.

I Dans un sac à dos charger un ensemble des objets ayant une valeur totale maximale (contrainte de volume)

I Trouver les configurations du jeu Tic-Tac-Toe

I Trouver les k-coloriages d’un graphe

I etc

Le problème SAT

Φ(x1,x2, ,· · ·,xn) =

m

^

i=1

Ci

Ci=xi1∨xi2∨ · · · ∨xiki,

I nvariables

I mclauses,kitaille de la clauseCiavec avecxill’une des variablesxjou sa négation.

I Forme normale conjonctive

(4)
(5)

E XEMPLE : n = 4 E = {a, b, c, d }

a

(6)

b a

(7)

E XEMPLE : n = 4 E = {a, b, c, d }

c b a

(8)

d c b a

(9)

E XEMPLE : n = 4 E = {a, b, c, d }

d

d d d d

c c ca ba ba bca ba a

a dc

c b

d b a

b d b

c c

∅ d c b a

(10)

0

1 1

1 0 0 0 0 0 0 0

0 1

1 0

1 0

1 1

0 1 0 1 0 1

1 1

1 0

1

d

d c

d c c d

d b b a

d b

c b

dc

a a a a

c c b ba bca ba d

∅ d c b a

À chaque élément on associe un booléen selon qu’il est présent ou non dans la partie.

On a unebijectionentre l’ensemble des parties d’un ensemble de taillenet l’ensemble des vecteurs de bits de dimensionn(choix d’un rang par élément) Ici la partie{b,d}pourrait être codée par

a b c d

0 1 0 1

(11)

É NUMÉRATION DIRECTE DES PARTIES D UN ENSEMBLE

procédureénumérer_Codage(Y)

Données: Y={y0,· · ·,yn−1}ensembles d’éléments Résultat: Une et une seule visite de chaque partie deY fori=0to2n−1

Écrireien binaire

Convertir le vecteur de bits en une partiepideY Visiterp

I Coût de l’énumération2nétapes

I Parcourt fixé par la numérotation des éléments deY

I Difficile de faire le lien entre le nombre entieriet des propriétés de la partiepi(par exemple le cardinal)

(12)

procédureénumérer_visiter_parties(X,Y) ifX=∅

Visiter(Y) else

x=Choisir(X)

énumérer_visiter_parties(X\{x},Y) énumérer_visiter_parties(X\{x},Y∪ {x})

I Comment se fait le passage de paramètres ?

I Quel est l’appel initial ?

I Que fait l’algorithme ?

I Quel est le coût de cet algorithme ?

(13)

É NUMÉRATION RÉCURSIVE DES PARTIES D UN ENSEMBLE

procédureénumérer_visiter_parties(X,Y) ifX=∅

Visiter(Y) else

x=Choisir(X)

énumérer_visiter_parties(X\{x},Y) énumérer_visiter_parties(X\{x},Y∪ {x})

I Comment se fait le passage de paramètres ?passage par valeurs

I Quel est l’appel initial ?

I Que fait l’algorithme ?

I Quel est le coût de cet algorithme ?

(14)

procédureénumérer_visiter_parties(X,Y) ifX=∅

Visiter(Y) else

x=Choisir(X)

énumérer_visiter_parties(X\{x},Y) énumérer_visiter_parties(X\{x},Y∪ {x})

I Comment se fait le passage de paramètres ?passage par valeurs

I Quel est l’appel initial ?énumérer_visiter_parties(X,∅)

I Que fait l’algorithme ?

I Quel est le coût de cet algorithme ?

(15)

É NUMÉRATION RÉCURSIVE DES PARTIES D UN ENSEMBLE

procédureénumérer_visiter_parties(X,Y) Données:XetYensembles disjoints d’éléments

Résultat: Une et une seule visite de chaque partie deX∪Yde la formep∪Y avecp⊂X

ifX=∅ Visiter(Y) else

x=Choisir(X)

énumérer_visiter_parties(X\{x},Y) énumérer_visiter_parties(X\{x},Y∪ {x})

I Comment se fait le passage de paramètres ?passage par valeurs

I Quel est l’appel initial ?énumérer_visiter_parties(X,∅)

I Que fait l’algorithme ?

I Quel est le coût de cet algorithme ?

(16)

procédureénumérer_visiter_parties(X,Y) Données:XetYensembles disjoints d’éléments

Résultat: Une et une seule visite de chaque partie deX∪Yde la formep∪Y avecp⊂X

ifX=∅ Visiter(Y) else

x=Choisir(X)

énumérer_visiter_parties(X\{x},Y) énumérer_visiter_parties(X\{x},Y∪ {x})

I Comment se fait le passage de paramètres ?passage par valeurs

I Quel est l’appel initial ?énumérer_visiter_parties(X,∅)

I Que fait l’algorithme ?

I Quel est le coût de cet algorithme ?2nappels, avecnla taille deX

(17)

É NUMÉRATION DES PARTIES D UN ENSEMBLE : PREUVE

procédureénumérer_visiter_parties(X,Y) Données:XetYensembles disjoints d’éléments

Résultat: Une et une seule visite de chaque partie deX∪Yde la formep∪Y avecp⊂X

ifX=∅ Visiter(Y) else

x=Choisir(X)

énumérer_visiter_parties(X\{x},Y) énumérer_visiter_parties(X\{x},Y∪ {x})

I Que faut-il prouver ?

I Comment faire la preuve ?

(18)

procédureénumérer_visiter_parties(X,Y) Données:XetYensembles disjoints d’éléments

Résultat: Une et une seule visite de chaque partie deX∪Yde la formep∪Y avecp⊂X

ifX=∅ Visiter(Y) else

x=Choisir(X)

énumérer_visiter_parties(X\{x},Y) énumérer_visiter_parties(X\{x},Y∪ {x})

I Que faut-il prouver ?

énumérer_visiter_parties(X,∅) visite une et une seule fois chaque partie deX

I Comment faire la preuve ?

(19)

É NUMÉRATION DES PARTIES D UN ENSEMBLE : PREUVE

procédureénumérer_visiter_parties(X,Y) Données:XetYensembles disjoints d’éléments

Résultat: Une et une seule visite de chaque partie deX∪Yde la formep∪Y avecp⊂X

ifX=∅ Visiter(Y) else

x=Choisir(X)

énumérer_visiter_parties(X\{x},Y) énumérer_visiter_parties(X\{x},Y∪ {x})

I Que faut-il prouver ?

énumérer_visiter_parties(X,∅) visite une et une seule fois chaque partie deX

I Comment faire la preuve ? Correction partielle

(20)

ifX=∅

Visiter(Y) (0)

else

x=Choisir(X)

énumérer_visiter_parties(X\{x},Y) (1) énumérer_visiter_parties(X\{x},Y∪ {x}) (2)

Correction partielle

I pré-condition de l’appel :XetYsont 2 ensembles disjoints

I SiX=∅( on est dans le cas de base(0)) la récursion s’arrête et on visiteY, commeYest la seule partie deX∪YcontenantY(carXest vide) le résultat est correct.

I SiX6=∅( on est dans le cas général) alors les paramètres des appels récursifs(1)et(2) sont également disjoints. Pour un élémentxdonné deX, les parties deX∪YcontenantY, soit ne contiennent pasxet sont donc visitées par l’appel(1), soit contiennentxet sont donc visitées par l’appel(2). Ici chaque partie visitée ne l’est qu’une seule fois car les deux appels visitent des parties différentes.

I lors de l’appel initial la pré-condition est vérifiée

I au retour de l’appel toutes les parties deX∪YcontenantYont été visitées

(21)

C ORRECTION (2)

procédureénumérer_visiter_parties(X,Y) ifX=∅

Visiter(Y) (0)

else

x=Choisir(X)

énumérer_visiter_parties(X\{x},Y) (1) énumérer_visiter_parties(X\{x},Y∪ {x}) (2)

Terminaison

I SoitV(X,Y) =|X|,

I V(X,Y)est un entier positif et strictement décroissant sur l’arbre des appels.

Donc l’arbre des appels est fini et donc l’appel se termine.

(22)

I Principe de la preuve (de correction partielle) d’une procédure récursive

Si, avec l’hypothèse que les appels récursifs sont corrects et que les paramètres vérifient la pré-condition, on prouve que le corps de la procédure est correct, alors le code de la procédure est correct.

I Appel initial

Les paramètres de l’appel initial vérifient la pré-condition.

I Terminaison

Si l’appel se termine alors la post-condition implique la correction de l’algorithme.

Terminaison

I Variantassocié aux appels

I Vfonction des paramètres d’appel (entier)

I Vdécroissant

I Vborné inférieurement l’appel récursif se termine.

(23)

C OÛT DE L ALGORITHME

procédureénumérer_visiter_parties(X,Y) ifX=∅

Visiter(Y) (0)

else

x=Choisir(X)

énumérer_visiter_parties(X\{x},Y) (1) énumérer_visiter_parties(X\{x},Y∪ {x}) (2)

I Nombre d’appels effectués par l’algorithmeC(N)(Ntaille deXlors de l’appel initial) remarque : le coût ne dépend que de la taille du premier paramètre de l’appel.

I Équation de récurrence

C(N) =C(N−1) +C(N−1);

C(0) =1 C(N) =2N.

I Coût en temps exponentiel dans la taille de la donnée.

(24)

I Proposer une(des) structure(s) de donnée pour coder une partie d’un ensemble

I Réécrire l’algorithme avec cette structure de donnée

I Écrire la procédure lorsque le passage d’argument se fait par référence

I Adapter l’algorithme pourVisitertoutes les parties de cardinalkd’un ensemble. On pourra introduire des conditions d’explorations des branches de l’arbre (ne pas faire les appels inutiles).

(25)

P ROBLÈME

Le problèmeSOMME

Étant donné un ensemble dennombres entiers{x1,· · ·,xn}et un entierS, existe-t’il un sous-ensemble d’indices distincts{i1,· · ·,ik}tels que

xi1+· · ·xik=S

Le cas échéant donner toutes les solutions possibles.

1 Écrire un algorithme de recherche d’une solution

2 Écrire la preuve de l’algorithme.

3 Proposer des conditions de branchement.

4 Programmer l’algorithme et évaluer le nombre d’appels effectués.

5 Quels pré-calculs peut-on faire pour améliorer l’algorithme ?

On pourra écrire un générateur de jeux de tests, qui à partir d’un germe de générateur aléatoire, fournit un ensemble denentiers. On pourra faire varier la valeur deSpour analyser l’efficacité des conditions de branchement.

Références

Documents relatifs

1) Si je suis espagnol, alors je suis européen. 2) Si je suis enfant unique, alors je n’ai ni frère, ni sœur. 3) Si je suis français, alors je suis guadeloupéen. 4) Si je

Bon, c’est sûr que la motricité fine, effectivement dans tous les exercices de motricité fine où on peut voir… parfois, c’est pas flagrant, il y a un enfant qui peut tout à

Vous ferez intervenir trois variables permettant de stocker les trois longueurs données par l’utilisateur!. Vous ferez plusieurs essais afin de tester la validité

[r]

Montrer que φ est nilpotent si et seule mt si 0 est l’unique valeur

CONDITION RACINES DU POLYNOME FORME FACTORISEE DU POLYNOME. SI

Si, en parcourant la liste L , X a déjà été lu K fois, et que N représente la longueur déjà reconnue comme la plus longue, pour une certaine valeur V, et si Y est l'élément

Que la fête continue Debout devant le zinc Sur le coup de dix heures Un grand plombier zingueur.. Habillé en dimanche et pourtant c'est lundi Chante pour lui