J'ai créé une application Android qui résout ce problème. Vous pouvez saisir des dépenses pendant le voyage, il vous recommande même "qui devrait payer ensuite". À la fin, il calcule "qui devrait envoyer combien à qui".Mon algorithme calcule nombre minimum requis de transactions et vous pouvez configurer la « tolérance de transaction » qui peut réduire les transactions encore plus loin (vous ne se soucient pas de 1 $ transactions) Essayez, il appelle Settle Up:
https://market.android.com/details?id=cz.destil.settleup
Description de mon algorithme:
J'ai un algorithme de base qui résout le problème avec n-1 transactions, mais ce n'est pas optimal. Cela fonctionne comme ceci: De paiements, je calcule l'équilibre pour chaque membre. L'équilibre est ce qu'il a payé moins ce qu'il devrait payer. Je trier les membres en fonction de l'équilibre de plus en plus. Ensuite, je prends toujours les plus pauvres et les plus riches et la transaction est faite. Au moins l'un d'entre eux se retrouve avec un solde nul et est exclu des autres calculs. Avec cela, le nombre de transactions ne peut pas être pire que n-1. Il minimise également la quantité d'argent dans les transactions. Mais ce n'est pas optimal, car il ne détecte pas les sous-groupes qui peuvent s'installer en interne.
Il est difficile de trouver des sous-groupes qui peuvent s'installer en interne. Je le résous en générant toutes les combinaisons de membres et en vérifiant si la somme des soldes dans le sous-groupe est égale à zéro. Je commence par 2 paires, puis 3 paires ... (n-1) paires. Les implémentations de générateurs combinés sont disponibles. Quand je trouve un sous-groupe, je calcule les transactions dans le sous-groupe en utilisant l'algorithme de base décrit ci-dessus. Pour chaque sous-groupe trouvé, une transaction est épargnée.
La solution est optimale, mais la complexité augmente jusqu'à O (n!). Cela semble terrible mais l'astuce est qu'il y aura juste un petit nombre de membres dans la réalité. Je l'ai testé sur Nexus One (processeur 1 Ghz) et les résultats sont: jusqu'à 10 membres: < 100 ms, 15 membres: 1 s, 18 membres: 8 s, 20 membres: 55 s. Donc jusqu'à 18 membres le temps d'exécution est bien. Une solution de contournement pour> 15 membres peut être d'utiliser seulement l'algorithme de base (c'est rapide et correct, mais pas optimal).
code source:
Le code source est disponible à l'intérieur d'un rapport sur l'algorithme écrit en tchèque. Le code source est à la fin et il est en anglais:
http://www.settleup.info/files/master-thesis-david-vavra.pdf
Est-ce un travail à faire? – Glen
sonne comme une mission de «voyage de golf». – Cheeso
Eh bien .. Je suis juste curieux de régler mes dépenses avec mon groupe d'amis .. Il suffit d'agir intelligemment pour faire autre chose qu'excel. Pas de devoirs de toute façon. :) – Guru