PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Lösung für Näherung


Ben Carter
2021-03-10, 10:42:11
Hallo allerseits!

Ich habe ein interessantes Problem, für das ich theoretisch eine Lösung habe, aber ich kann mir vorstellen, dass es da bessere Möglichkeiten gibt.

Problem:
Für eine Abrechnung weiß ich, dass die Person am Ende des Monats einen gewissen Betrag erhält. Zum Beispiel € 800,-. Jedoch wird nicht an jedem Tag des Monats gleich viel verdient, sodass ich pro Tag eine prozentuelle Aufteilung habe.

z.B.
1.3.: 3%
2.3.: 4%
3.3.: 1,5%
4.3.: 4,3%
5.3.: 0%
usw.

Die Prozente rechne ich in Beträge um, sodass ich weiß, wie viel an welchem Tag verdient werden darf.

Soweit noch alles ganz einfach. Jedoch habe ich nur gewisse, fixe Beträge, die ich verrechnen darf, die auch noch von Tag zu Tag variieren. So passiert es, dass die tatsächlichen Beträge immer wieder neben den zu erreichenden Beträgen sind. Das ist okay, aber am Ende des Monats sollte es eben so nah als möglich sein.

Tag|Soll-Betrag|Ist-Betrag|Differenz
1.3.|24|22|2
2.3.|32 (+2)|35|-1
3.3.|12 (-1)|10|1
...|...|...|...
31.3.|10 (+5)|14|1

Das funktioniert soweit schon ganz gut, jedoch nicht, wenn z.B. an den ersten Tagen immer wieder 0% sind und erst gegen Ende die Soll-Beträge steigen, weil ich dann mit dem IST nicht mehr hinterherkomme.

Mein Ansatz ist also, ich rechne es einmal so durch, nehme dann die Differenz, die mir am Ende überbleibt und addiere es gleich zum ersten Tag hinzu und verringere alle Soll-Beträge prozentuell so, dass am Ende noch immer der gleiche Betrag rauskommt.

Das kommt dann schon halbwegs gut hin, aber es gibt immer noch Corner-Cases, bei denen das einfach nicht wirklich gut funktioniert.

Meine Frage nun, wie löst man das am Besten?
Gibt es dafür irgend eine mathematische Lösung oder ist dieses Schrittweise annähern eh schon die Lösung? Elegant ist es ja nicht gerade.

Das Ganze ist hier auch noch etwas vereinfacht dargestellt, da ich noch ein paar mehr Variablen habe. Neben den vorgegeben Beträgen, die pro Tag variieren, gibt es auch noch welche, die mir "besser" gefallen und welche, die ich zwar nehmen kann, aber nur, wenn es anders nicht geht.

Falls es interessiert, es geht um eine Diäten-Abrechnung, die einerseits möglichst nahe an der Realität sein soll, in Abhängigkeit von Land und Dauer des Aufenthalts Tag/Nacht und andererseits aber auf jeden Fall einen ganz bestimmten Betrag mit geringstmöglicher Abweichung erreichen muss.

Danke,
lg Ben

universaL
2021-03-10, 12:47:13
hört sich stark nach einem Optimierungsproblem an, minimiere die summe der beträge der differenzen, ...

Wie definieren sich die erlaubten Beträge? Verstehe das Problem noch nicht so wirklich.

Ben Carter
2021-03-10, 15:16:10
Wie sich die erlaubten Beträge definieren ist sehr komplex, aber das ist für die Problemstellung nicht von Belang. Ich habe für jeden Tag alle möglichen erlaubten Beträge, die vorher schon berechnet werden.

Das Problem ist, dass bei nur einem Durchgang am Ende die Differenz groß sein kann. Theoretisches Beispiel:

1. bis 30. März sind 0%
31. März = 100%

Ich muss 800 € auf den März aufteilen, somit kommen alle 800 € auf den letzten Tag.

Ich geh nun Tag für Tag durch, hab immer 0 € als Soll-Betrag und 0 € als Ist-Betrag. Am letzten Tag dann hab ich 800 € als Soll-Betrag. Mein höchster, möglicher Betrag ist aber bei 60€. Also fehlen mir 740 €.

Ich mache jetzt einen zweiten Durchgang und sage: mein monatlicher Betrag ist nicht 800 € sondern 800 € abzüglich der Differenz am Ende (740) also 60€. Und ich beginne mit einer Differenz von 740 €.

Somit bauen sich über die ersten Tage die 740 € schon ab und am Ende schaffe ich die 60€ des letzten Tages und komme somit ziemlich gut auf die 800 € für das gesamte Monat.

Aber das ist a.) umständlich und b.) gibt es Fälle, wo es dennoch nicht wirklich gut funktioniert. Darum frage ich, ob es eine bessere Lösung gibt.

Maorga
2021-03-10, 15:37:46
Teile einfach die Summe X durch die Tage Y.

universaL
2021-03-10, 15:41:33
hmm,

pseudo-code-idee-problem:

\arg\min \sum\limits_{i=1}^31 abs(d_i)
s.t.
e_i = prozent_i * 800
d_i = e_i - chosen_i
chosen_i \in allowed_i
800 = sum_{i=1}^31 chosen_i


in einen Optimierer deiner Wahl ;-) Geht sicher auch per Backtracking oder so, aber da fehlt mir die Idee... Hammer -> Nagel undso ;D

Ben Carter
2021-03-10, 16:12:51
Teile einfach die Summe X durch die Tage Y.
Das ist zwar sehr einfach, entspricht dann jedoch niemals auch nur annähernd der Realität und führt ebenfalls zu Problemen, wenn an manchen Tagen die erlaubten Beträge deutlich niedriger sind.

hmm,

pseudo-code-idee-problem:

\arg\min \sum\limits_{i=1}^31 abs(d_i)
s.t.
e_i = prozent_i * 800
d_i = e_i - chosen_i
chosen_i \in allowed_i
800 = sum_{i=1}^31 chosen_i


in einen Optimierer deiner Wahl ;-) Geht sicher auch per Backtracking oder so, aber da fehlt mir die Idee... Hammer -> Nagel undso ;D
Danke, aber um ehrlich zu sein, verstehe ich den Pseudo-Code nicht. Ich komme mit C, Java, PHP, VB Syntax klar

BAGZZlash
2021-03-10, 16:55:31
Das ist nur eine mathematische Formulierung des Problems. Sieht in etwa so aus, kennst Du sicher aus der Schule:

https://www.matheboard.de/latex2png/latex2png.php?\min%20\sum\limits_{i=1}^{31}%20|d_i|\\s.t.\\e_i%20=%20\text{proze nt}_i%20\cdot%20800\\d_i%20=%20e_i%20-%20\text{chosen}_i\\\text{chosen}_i%20\in%20\text{allowed}_i\\800%20=%20\sum_{i= 1}^{31}%20\text{chosen}_i

Das muss man jetzt eben in einen Optimizer stecken.

/edit: Hab's mal in Excel aufgesetzt, siehe anbei. Erfordert, dass das Excel-Add-In "Solver" aktiviert ist. Für die erlaubten Werte an jedem Tag habe ich mal Fantasiewerte angenommen, weil Du uns die wahren Werte ja nicht verrätst.

Ben Carter
2021-03-11, 07:10:35
Vielen Dank, so dargestellt, ergibt das für mich auch mehr Sinn. :up:
Ich werde es mir heute Abend in Ruhe zu Gemüte führen.

lg Ben

universaL
2021-03-18, 08:50:35
und? was ist bei rausgekommen?

Ben Carter
2021-03-19, 19:04:48
Leider erst mal on hold, da beim Kunden nun geklärt wird, ob das wirklich so gemacht werden will oder die Berechnung doch anders erfolgt. So wie sich was ergibt, gebe ich natürlich bescheid. Lust hätte ich ja schon, mich weiter damit auseinander zusetzen, nur wenn es niemand zahlt, ist die Zeit dafür auch net da.

Hamster
2021-03-22, 16:22:08
Na dann hoffe ich, dass du den Helfenden hier auch etwas bezahlt hast...

Ben Carter
2021-03-22, 17:01:01
Du meinst, so, wie ich für jede helfende Antwort auch bezahlt werde?

Nichts für ungut, ich bin dankbar für die Hilfe und ich würde da auch gerne weitermachen, aber so lange es on hold ist und der Kunde nicht dafür zahlt, dass ich vor Ort bin (und ich kann nur vor Ort weitermachen, da es u.a. um sensible Daten geht), kann ich nicht weitermachen.

Und privat, das neben der Arbeit das Projekt nochmals aufzusetzen, dafür fehlt mir leider schlicht und ergreifend die Zeit.

On hold heißt aber nicht, dass es auf keinen Fall gemacht wird. Es ist eben noch offen. Hätte ich das vorher gewusst, hätte ich auch (noch) nicht nachgefragt.

EDIT: um etwaige Missverständnisse zu vermeiden, ich bin nicht selbstständig, sondern angestellt.