web-dev-qa-db-fra.com

Pourquoi l'algorithme de changement de pièce gourmande ne fonctionne-t-il pas avec certains ensembles de pièces?

Je comprends comment fonctionne l’algorithme gourmand pour le problème de la monnaie (payer un montant spécifique avec le nombre de pièces minimal possible) - il sélectionne toujours la pièce dont la valeur nominale ne dépasse pas la somme restante - et trouve toujours la solution correcte ensembles de pièces spécifiques.

Mais pour certains ensembles de pièces, il existe des sommes pour lesquelles l'algorithme glouton échoue. Par exemple, pour l'ensemble {1, 15, 25} et la somme 30, l'algorithme glouton choisit d'abord 25, en laissant un reste de 5, puis cinq 1 pour un total de six pièces. Mais la solution avec le nombre minimal de pièces est de choisir 15 fois.

Quelles conditions doit remplir un ensemble de pièces pour que l'algorithme glouton trouve la solution minimale pour toutes les sommes?

47
user1311286

Un ensemble qui forme un matroid ( https://en.wikipedia.org/wiki/Matroid ) peut être utilisé pour résoudre le problème du changement de pièce en utilisant une approche gourmande. En bref, un matroïde est une paire ordonnée M = (S, l) satisfaisant les conditions suivantes:

  1. S est un ensemble fini non vide
  2. l est une famille non vide de sous-ensembles de S, appelés sous-ensembles indépendants, tels que si B-> 1 et A est un sous-ensemble de B, alors A -> l
  3. Si A-> l, B-> l et | A | <| B |, alors il y a un élément x-> B-A tel que A U {x} -> l

Dans notre question sur le changement de pièces, S est un ensemble de toutes les pièces en ordre décroissant Nous devons atteindre une valeur de V avec un nombre minimal de pièces en S

Dans notre cas, l est un ensemble indépendant contenant tous les sous-ensembles tels que les éléments suivants sont valables pour chaque sous-ensemble: la somme de leurs valeurs est <= V

Si notre ensemble est un matroïde, alors notre réponse est l'ensemble maximal A dans l, dans lequel aucun x ne peut être ajouté

Pour vérifier, nous voyons si les propriétés de matroid sont conservées dans l'ensemble S = {25,15,1} où V = 30Maintenant, il existe deux sous-ensembles dans l: A = {25} et B = {15,15} Depuis | A | <| B |, alors il existe un élément x-> BA tel que AU {x} -> l (Selon 3) Donc, {25,15} devrait appartenir à l, mais c’est une contradiction à partir de 25 + 15 > 30

Donc, S n’est pas un matroïde et donc l’approche gourmande ne fonctionnera pas.

17
Tanu Saxena

Dans tous les cas où il n’existe aucune pièce dont la valeur, ajoutée à la valeur la plus basse, soit inférieure à deux fois celle de la valeur immédiatement inférieure, l’algorithme glouton fonctionne.

c'est-à-dire que {1,2,3} fonctionne parce que [1,3] et [2,2] ajoutent à la même valeur cependant {1, 15, 25} ne fonctionne pas car (pour le changement 30) 15 + 15> 25 + 1 

7
Robert Herriott

C'est un problème de récurrence. Avec un ensemble de pièces {Cn, Cn-1, . . ., 1}, tel que pour 1 <= k <= n, Ck > Ck-1, l'algorithme Greedy donnera le nombre minimum de pièces si Ck> Ck-1 + Ck-2 et pour la valeur V=(Ck + Ck-1) - 1, en appliquant l'algorithme Greedy au sous-ensemble de pièces {Ck, Ck-1, . . ., 1}, où Ck <= V, donne moins de pièces que le nombre résultant de l’application de l’algorithme Greedy au sous-ensemble de pièces {Ck-1, Ck-2, . . ., 1}

Le test est simple: pour `1 <= k <= n, testez le nombre de pièces que l'algorithme Greedy donne pour une valeur de Ck + Ck-1 - 1. Faites ceci pour le jeu de pièces {Ck, Ck-1,. . ., 1} et {Ck-1, Ck-2,. . ., 1}. Si pour tout k, le dernier produit moins de pièces que le premier, l'algorithme Greedy ne fonctionnera pas pour cet ensemble de pièces. 

Par exemple, avec n = 4, considérons le jeu de pièces {C4, C3, C2, 1} = {50,25,10,1}. Commencez avec k = n = 4, puis V = Cn + Cn-1 - 1 = 50 + 25-1 = 74 comme valeur de test. Pour V = 74, G {50,25,10,1} = 7 pièces. G {25, 10, 1} = 8 pièces. Jusqu'ici tout va bien. Soit maintenant k = 3. alors V = 25 + 10-1 = 34. G {25, 10, 1} = 10 pièces mais G {10, 1} = 7 pièces. Nous savons donc que l’algorithme Greedy ne réduira pas le nombre de pièces pour le jeu de pièces {50,25,10,1}. D'autre part, si nous ajoutons un nickel à cet ensemble de pièces, G {25, 10, 5, 1} = 6 et G {10, 5, 1} = 7. De même, pour V = 10 + 5-1 = 14, nous obtenons G {10, 5, 1} = 5, mais G {5,1} = 6. Nous savons donc que Greedy fonctionne pour {50,25,10,5,1}. 

Cela pose la question suivante: quelle devrait être la dénomination des pièces, satisfaisant l’algorithme Greedy, qui donne le plus petit nombre de pièces dans le pire des cas pour une valeur comprise entre 1 et 100? La réponse est assez simple: 100 pièces, chacune avec une valeur différente de 1 à 100. Cela n’est sans doute pas très utile car il permet une recherche linéaire des pièces à chaque transaction. Sans parler de la dépense de frapper autant de dénominations différentes et de les suivre. 

Maintenant, si nous voulons principalement minimiser le nombre de coupures en minimisant ensuite le nombre de pièces résultant pour une valeur de 1 à 100 produite par Greedy, alors les pièces en coupures de puissances de 2: {64, 32, 16, 8, 4 , 2, 1} résultent en un maximum de 6 pièces pour toute valeur de 1: 100 (nombre maximal de 1 dans un nombre de sept bits dont la valeur est inférieure à 100 décimales). Mais cela nécessite 7 dénominations de pièces. Le cas le plus défavorable pour les cinq valeurs unitaires {50, 25, 10, 5, 1} est 8, ce qui se produit à V = 94 et V = 99. Les pièces en monnaie de 3 {1, 3, 9, 27, 81} ne nécessitent également que 5 coupures pour être utilisées par Greedy, mais donnent également le pire cas de 8 pièces aux valeurs de 62 et 80. Enfin, en utilisant l'une des cinq valeurs Le sous-ensemble de {64, 32, 16, 8, 4, 2, 1} qui ne peut exclure "1" et qui satisfait Greedy, donnera également lieu à un maximum de 8 pièces. Il y a donc un compromis linéaire. L'augmentation du nombre de coupures de 5 à 7 réduit le nombre maximal de pièces nécessaire pour représenter une valeur comprise entre 1 et 100 de 8 à 6, respectivement.

D'autre part, si vous voulez minimiser le nombre de pièces échangées entre un acheteur et un vendeur, en supposant que chacune d'entre elles ait au moins une pièce de chaque valeur nominale dans leur poche, alors ce problème équivaut au moins de poids qu'il possède. prend pour équilibrer un poids de 1 à N livres. Il s'avère que le plus petit nombre de pièces échangées lors d'un achat est atteint si les coupures sont données en puissances de 3: {1, 3, 9, 27, . . .}.

Voir https://puzzling.stackexchange.com/questions/186/whats-the-fewest-weights-you-need-to-balance-any-weight-from-1-to-40-pounds .

4
Pavlo

Un système de pièces est canonique si le nombre de pièces donné en modification par l'algorithme glouton est optimal pour tous les montants.

Cet article propose un algorithme O (n ^ 3) pour décider si un système de pièces est canonique, n étant le nombre de types de pièces différents.

Pour un système de pièces non canonique, il existe un montant c pour lequel l'algorithme glouton produit un nombre sous-optimal de pièces; c est appelé un contre-exemple. Un système de pièces est serré si son plus petit contre-exemple est plus grand que la plus grosse pièce.

0
Lohitaksh Trehan