Kombinatorik

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

Hallo

Ein paar Großkunden zahlen nicht immer fristgerecht sondern sporadisch ein Haufen Rechnungen per SAP auf einmal. Dadurch sehe ich auf dem Bankauszug nicht, um welche Rechnungen es handelt sonder da steht dann nur AVIS vom ....

Bis jetzt habe ich immer händisch die offenen Rechnungen raus genommen und geraten, die Rg. und die Rg. könnten den Betrag ergeben. Die Kunden möchte ich auch nicht permanent belästigen und fragen, was denn nun überwiesen wurde. So dachte ich, dass ich mir ein Programm schreibe. Leider bin ich mathematisch nicht sonderlich begabt und mir fehlt die Logik, wie ich dies mittels Python umsetzen kann. Anbei mal ein Beispiel aus der Praxis. Alle Rechnungen außer ``R0010`` wurden bezahlt.

Wie kann ich das mit Python machen, so dass mir die noch nicht bezahlten Rechnungen automatisch ausgegeben werden? Für ein paar Tipps wäre ich dankbar :wink:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8

from __future__ import print_function, division
#import itertools


def main():
    ueberwiesener_betrag = 16918.10
    offene_rechnungen = {
                         'R0001': 1640.25,
                         'R0002': 437.40,
                         'R0003': 4160.40,
                         'R0004': 510.30,
                         'R0005': 255.15,
                         'R0006': 3942.00,
                         'R0007': 3807.00,
                         'R0008': 1910.45,
                         'R0009': 255.15,
                         'R0010': 1321.00,
                         }

    betrag_offen_total = [rg_betrag for rg_nummer, rg_betrag in offene_rechnungen.items()]
    print(sum(betrag_offen_total))


if __name__ == '__main__':
    main()
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Rucksackproblem?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

itertools ist schonmal ein guter Ansatz.

Mein Vorschlag:

Code: Alles auswählen

#!/usr/bin/env python3
import itertools

def main():
    ueberwiesen = 1691810
    betraege = [164025, 43740, 416040, 51030, 25515, 394200, 380700, 191045,
                25515, 132100]

    kombinationen = []
    trait = lambda xs: sum(xs) == ueberwiesen
    
    for n in range(len(betraege)):
        kombinationen.extend(filter(trait, itertools.combinations(betraege, n)))
        
    print(kombinationen)

if __name__ == '__main__':
    main()
Dies erzeugt eine Liste von Kombinationen aus den Beträgen der (noch) offenen Rechnungen, deren Summe gleich dem überwiesenen Betrag ist.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Antworten