Payer collectivement le problème de la facture

23

Il y a personnes à une table. La ème personne doit payer dollars.njepje

Certaines personnes n'ont pas les bonnes factures pour payer exactement , alors elles proposent l'algorithme suivant.pje

Tout d'abord, tout le monde met une partie de son argent sur la table. Ensuite, chaque individu reprend l'argent qu'il a payé en trop.

Les factures ont un ensemble fixe de coupures (ne font pas partie de l'entrée).

Un exemple: supposons qu'il y ait deux personnes, Alice et Bob. Alice doit 5 $ et a cinq billets de 1 $ . Bob doit 2 $ et a un billet de 5 $ . Après qu'Alice et Bob aient mis tout leur argent sur la table, Bob reprend 3 $ et tout le monde est content.

Bien sûr, il y a des moments où l'on n'a pas à mettre tout son argent sur la table. Par exemple, si Alice avait mille billets de 1 $ , il n'est pas nécessaire qu'elle les mette tous sur la table puis les reprenne.

Je veux trouver un algorithme avec les propriétés suivantes:

  1. L'entrée spécifie le nombre de personnes, combien chaque personne doit et combien de factures de chaque dénomination chaque personne a.

  2. L'algorithme indique à chaque personne les factures à mettre sur la table au premier tour.

  3. L'algorithme indique à chaque personne les factures à retirer du tableau au deuxième tour.

  4. Le nombre de factures déposées sur la table + le nombre de factures retirées de la table est minimisé.

S'il n'y a pas de solution réalisable, l'algorithme renvoie simplement une erreur.

Chao Xu
la source
9
Les dénominations des factures fixés à l' avance (disons aux dénominations américaines $ 1, $ 2, $ 5, $ 10, $ 20, $ 50 et $ 100), ou une partie de l'entrée? En d'autres termes, l'algorithme doit-il gérer la possibilité que Méphistophélès ait trois billets de 7 $ , un billet de 13 $ et quinze billets de 4 $ ?
JeffE
1
Les factures sont fixes. Je suppose que dans ce cas, je ne peux pas réduire la somme des sous-ensembles et prouver que c'est NP-Hard. Je vais le modifier.
Chao Xu
1
Vous avez besoin d'un moyen d'exprimer 4/5 en une seule optimisation. Il n'est pas possible d'optimiser pour ces deux conditions indépendantes. Je sais ce que vous avez l'intention, j'ai eu un problème similaire auparavant, mais vous devez quantifier exactement ce que cela signifie d'optimiser pour les deux conditions.
edA-qa mort-ora-y
3
Je pense qu'il serait préférable, comme point de départ, de supposer que tout le monde paie exactement la facture ou que l'algorithme signale simplement un échec.
JeffE
2
Quelle est exactement la question ici, y a-t-il des exigences de complexité? L'écriture d'un algorithme naïf semble triviale, ou est-ce que je manque quelque chose?
Stéphane Gimenez

Réponses:

6

Si vous reformulez le problème d'une manière légèrement différente (mais équivalente), un algorithme devient plus évident:

nn-1pjejep0

p=(61,11,1,5)

Autrement dit, lorsque le repas est terminé, le restaurant devrait avoir 61 $ , Alice devrait avoir 11 $ , Bob devrait avoir 1 $ et Carl devrait avoir 5 $ .

bm

b=(1,5,dix,20,1,1,5,5,dix,20)

Les coupures des billets n'ont pas d'importance, mais j'ai choisi les coupures de papier américain pour cet exemple parce qu'elles sont familières.

jej{0,1}CC0,j=0j

Poursuivant notre exemple:

C=[0000000000000011111111110000111111111100]

indique que Alice a commencé avec $ 1, $ 5, $ 10, $ 20, Bob a commencé avec $ 1, $ 1, $ 5, $ 5, et Carl a commencé avec $ 10 et $ 20.

Encore une fois, l'objectif est de minimiser le nombre de factures qui changent de mains. En d'autres termes:

Minimiser:je=0n-1j=0m-1Cje,jXje,jsujet à:je=0n-1Xje,j=1 pour 0j<m,j=0m-1Xje,jbj=pje pour 0je<n,etXje,j0

La première contrainte dit que la solution ne peut affecter une facture particulière qu'à une seule partie, et la seconde garantit que chacun paie le montant approprié.

Il s'agit du problème de PROGRAMMATION 0,1 INTEGER et il est NP-complet (voir [ Karp 1972 ]). La page Wikipedia sur la programmation linéaire contient des informations sur différents algorithmes qui peuvent être utilisés pour ces types de problèmes.

Il existe potentiellement plusieurs solutions optimales; à la main, la première solution à l'exemple que j'ai proposé était:

X=[0101100111101000000000001000000000001000]

ce qui signifie Alice paie exactement $ 5 et $ 20, Bob paie exactement $ 1, $ 5 et $ 5 et Carl surpaye $ 10 et $ 20 et retire ensuite un $ 5 à partir de la table.

J'ai également utilisé le module Mixed Integer Linear Program du système Sage Math qui a la capacité d'utiliser différents backends de solveurs ( GLPK , COIN , CPLEX ou Gurobi ). La première solution qu'il a donnée a été

X=[0101010111101000000000001000000000000100]

ce qui est presque le même sauf que Carl a pris les "autres" 5 $ que Bob a mis sur la table.

CX

Identifier un sous-ensemble de personnes qui peuvent payer le total réduit? Ou peut-être un sous-ensemble de personnes qui pourraient encore payer la totalité de la facture, c'est-à-dire payer pour leur ami.

Votre déclaration finale donne l'impression que vous êtes intéressé par le cas où les coupures des factures sont fixes, cela ne change cependant pas le problème.

O(1)

David
la source
Que ce problème puisse être exprimé comme IP était (presque?) Clair; mais quelle est la qualité de cette solution? Les adresses IP du formulaire créé peuvent-elles être résolues efficacement? Sinon, existe-t-il un algorithme plus rapide?
Raphael
Il existe une forme plus condensée de cette PI, en ayant une variable pour le nombre de billets d'une dénomination particulière qu'une variable 0,1. Les dénominations fixes modifient un peu la complexité, si le nombre de personnes est également fixe, l'algorithme de Lenstra peut le résoudre en temps polynomial.
Chao Xu
-2

Il est certain que certains départs de base pourraient consister à inclure les plus petites factures disponibles pour atteindre le montant total de la facture globale. Si vous ne vous souciez pas d'autoriser des billets de 2 $ , chaque personne pourrait simplement retirer la plus grosse facture qu'elle puisse retirer de la piscine et arriverait assez rapidement. Le billet de 2 $ jette cela car il ne se sous-divise pas bien entre les autres dénominations et complique grandement le problème. Il y a aussi certainement un certain nombre d'autres optimisations qui pourraient être faites pour faire des observations sur la nécessité d'ajouter des fonds supplémentaires au cours de la ronde 1 (par exemple, si le nombre total de billets de 1 $ est jamais suffisant pour couvrir la facture, alors tout le monde peuvent arrêter de mettre en place à moins qu'ils n'aient pas encore mis assez pour leur facture).

AJ Henderson
la source