Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Problème de Sac À Dos

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 4

Université des Sciences et de la Technologie

Houari Boumediene

Conception et Complexité des Algorithme

Rapport de Travaux Pratiques


Problèmes NP et NP-complets

Etudiant Professeur
KESSAL Haroune Ait Mehdi Mohamed

25 décembre 2023
1 Le problème de sac à dos
1 Définissez l’input et l’output pour la résolution de ce problème.
Input :
1. Un ensemble d’objets O avec des valeurs respectives.
2. Deux ensembles V et P représentant les poids et les valeurs respectivement.
3. Deux constantes réelles k et m.
Output :
Un sous-ensemble O’ inclus dans O tel que : v(Oi ) ≥ k et p(Oi ) ≤ m
P P

2 Solutions Positives et Négatives (Cardinalité 3) :


Solution Positive :

O = {20, 30, 50}
Solution Négative :
O′ = {10, 40, 50}

3 Structure de Données Appropriée :


Liste ou ensemble pour représenter les objets choisis dans une solution.

4 Nombre Total de Solutions Possibles :


2n = 25 = 32 solutions possibles.

5 Algorithme pour une Solution Positive (Cardinalité c) :


# include < stdio .h >

# define N 5 // Nombre d ’ objets


# define TARGET_VALUE 55 // Valeur cible
# define MAX_WEIGHT 100 // Poids maximal

// Fonction pour imprimer un sous - ensemble

void printSubset ( int subset [] , int size ) {


printf ("{ ") ;
for ( int i = 0; i < size ; i ++) {
printf ("% d " , subset [ i ]) ;
}
printf ("}\ n ") ;
}

// Fonction r é cursive pour g é n é rer les sous - ensembles

1
void knapsack ( int objects [] , int values [] , int weights [] , int n , int
,→ targetValue , int maxWeight , int subset [] , int subsetSize ,
,→ int currentWeight , int currentValue ) {
if ( currentWeight > maxWeight ) {
return ; // Si le poids d é passe la capacit é maximale ,
,→ abandonnez cette branche
}

if ( currentValue >= targetValue ) {


printSubset ( subset , subsetSize ) ; // Si la valeur cible est
,→ atteinte ou d é pass ée , imprimez le sous - ensemble
return ;
}

for ( int i = n ; i >= 1; i - -) {


subset [ subsetSize ] = objects [ i - 1];
knapsack ( objects , values , weights , i - 1 , targetValue ,
,→ maxWeight , subset , subsetSize + 1 , currentWeight +
,→ weights [ i - 1] , currentValue + values [ i - 1]) ;
}
}

int main () {
int objects [ N ] = {20 , 10 , 30 , 40 , 50};
int values [ N ] = {20 , 10 , 30 , 40 , 50};
int weights [ N ] = {20 , 10 , 30 , 40 , 50};

int subset [ N ];
knapsack ( objects , values , weights , N , TARGET_VALUE , MAX_WEIGHT ,
,→ subset , 0 , 0 , 0) ;

return 0;
}

5.1 Calculez sa complexité temporelle / théorique et spatiale :


Complexité Temporelle :

La complexité temporelle de cet algorithme est exponentielle en fonction du nombre d’ob-


jets.Chaque objet a deux possibilités : soit il est inclus dans le sous-ensemble, soit il ne l’est
N
pas.Ainsi, pour N objets, le nombre total
 de sous-ensembles possibles est 2 .
Donc, la complexité temporelle est O 2N .

Complexité Spatiale :

La complexité spatiale dépend principalement de la profondeur maximale de la récursion, c’est-


à-dire de la pile d’appels récursifs. Dans cet algorithme, la profondeur de la pile récursive est au
maximum égale au nombre d’objets N dans le pire cas.

2
Donc, la complexité spatiale est O (N ) ,en raison de la profondeur maximale de la récursion.

5.2 Montrez que le problème du sac à dos appartient à la classe des problèmes NP.
Le problème du sac à dos appartient à la classe des problèmes NP en raison de sa vérifiabilité
en temps polynomial. Pour chaque sous-ensemble candidat, il est possible de vérifier en temps
polynomial si les contraintes du problème sont respectées, à savoir si la somme des valeurs des
objets est supérieure ou égale à k et si la somme des poids des objets est inférieure ou égale à m.
De plus, le sous-ensemble d’objets lui-même sert de certificat dont la validité peut être vérifiée en
temps polynomial. Ainsi, le problème du sac à dos répond aux critères d’appartenance à la classe
NP.

Vous aimerez peut-être aussi