Seite 1 von 1

Kombinatorik

Verfasst: Mittwoch 3. Juni 2015, 08:47
von lackschuh
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()

Re: Kombinatorik

Verfasst: Mittwoch 3. Juni 2015, 09:10
von darktrym
Rucksackproblem?

Re: Kombinatorik

Verfasst: Mittwoch 3. Juni 2015, 10:06
von bwbg
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.