Verschoben! Aufteilung eines Wertes in unterschiedliche Teile

Neue Frage »

Tunarus Auf diesen Beitrag antworten »
Aufteilung eines Wertes in unterschiedliche Teile
Hallo zusammen,

ich stehe vor folgendem Problem:

Ich will eine eingegebene Zahl in eine beliebig zu bestimmende Anzahl ungleicher Zahlen teilen. Das heißt...

- Ich habe einen Eingangswert zwischen 210 und 1.000
- Ich will diesen Wert in eine beliebige Anzahl Teile aufteilen
- Die Anzahl dieser Teile liegt zwischen 2 und 20
- Die Teile sollen alle unterschiedlich groß sein

Ich setze das Ganze in einem VBA Makro in Excel um und habe das Makro soweit fertig.
Mir fehlt lediglich ein Algorithmus, der dafür sorgt, dass die Teile unterschiedlich groß sind.

Kennt jemand von euch eine Formel oder ähnliches, das sich hier zur Anwendung bringen lässt?

Herzlichen Dank für eure Bemühungen im Voraus,
Gruß, Tunarus
AD Auf diesen Beitrag antworten »

Das kannst du doch mit ein wenig Tricksen auch mit deinem bisherigen Algorithmus erreichen:

Angenommen, du willst Summe in genau verschiedene Summanden aufteilen, o.B.d.A. der Größe nach geordnet, also

mit .

Zur Erlangung dieses Ziels kannst du doch deinen Algorithmus auf die Summe loslassen, der liefert dann Werte mit

mit .

Anschließend setzt du für und hast eine gewünschte Lösung.
Tunarus Auf diesen Beitrag antworten »

Hallo Arthur,

sorry, ich habe vergessen zu erwähnen, dass ich ein Fachidiot bin. Ich kann zwar ganz passabel mit VBA Programmierung umgehen, aber an derart komplexen Formeln wie von dir geschildert, scheitert leider mein Verständnis.

Der von mir bisher verwendete Trick besteht darin, dass ich simplerweise die Eingabezahl durch die Anzahl der Summanden teile und mit diesem Mittel beginne zu rechnen:

(Mittel +1) + (Mittel - 1) + (Mittel + 2) + (Mittel - 2) ...

Da das nur bei einer geraden Anzahl Summanden hinhaut und ich darüber hinaus nur Ganzzahlen als Ergebnis brauche und daher die Werte runden muss, trickse ich erneut, breche das Summieren bei (Anzahl der Summanden - 1) ab, ermittle die Differenz zum Eingabewert an dieser Stelle und schlage den oben auf.

Ich stoße dabei auf zwei Probleme:

1.) Es kommt vor, dass der aufgeschlagene Wert bei einer ungeraden Anzahl von Summanden bereits vorhanden ist. Es sollen aber immer unterschiedliche Werte sein.

2.) Es kommt vor, dass der "aufgeschlagene" Wert negativ ist.

Anhand dieser radebrechenden Schilderung erkennst du sicher leicht mein mathematisches Niveau, für dass ich mich auch angemessen zu schämen bereit bin... allein - ich kann nicht anders. Ups

Ich wäre dir also sehr dankbar, für eine Erklärung ohne komplexe Formeln, wenn das möglich ist. Solltest das nicht möglich sein oder du dich jetzt jetzt kopfschüttelderweise abwenden, habe ich dafür alles Verständnis und danke ich dir dennoch für dein Posting.

Gruß,
Tunarus
AD Auf diesen Beitrag antworten »

Zitat:
Original von Tunarus
Ich wäre dir also sehr dankbar, für eine Erklärung ohne komplexe Formeln, wenn das möglich ist. Solltest das nicht möglich sein oder du dich jetzt jetzt kopfschüttelderweise abwenden, habe ich dafür alles Verständnis und danke ich dir dennoch für dein Posting.

Das akzeptiere ich nicht: Ich verwende keine komplexe Formeln, sondern nur die banale Summenformel



Wer das schon als "zu schwer" darstellt, aber gleichzeitig so komplexe Algorithmen programmiert, sollte sich mal auf den Hosenboden setzen und wenigstens versuchen, die Gedanken nachzuvollziehen.

--------------------------------

Vielleicht mal ein konkretes Beispiel: Sagen wir mal, du willst die Zahl 300 in 6 verschiedene Summanden zerlegen.

Dann besagt mein Vorschlag oben, dass du deinen Algorithmus auf anwendest, der möge die Summanden

7, 32, 32, 58, 78, 78

liefern, also zweimal dieselbe Zahl. Aus diesem 6-Tupel bastelst du gemäß obiger Anweisung die Zahlen

7, 32+1, 32+2, 58+3, 78+4, 78+5, also

7, 33 , 34 , 61 , 82, 83

und siehe da, es kommt Summe 300 heraus. Jetzt klar?
Tunarus Auf diesen Beitrag antworten »

...nicht schimpfen, ich versuch´s ja verwirrt

Also die beiden Formeln



und



und was sie machen, habe ich jetzt dank deines Beispiels verstanden.

Wie aber erhalte ich aus der 285 in deinem Beispiel die Ziffern
7, 32, 32, 58, 78, 78? ("...der möge die Summanden...liefern" - wie?)

Danke!
AD Auf diesen Beitrag antworten »
RE: Aufteilung eines Wertes in unterschiedliche Teile
Zitat:
Original von Tunarus
Wie aber erhalte ich aus der 285 in deinem Beispiel die Ziffern
7, 32, 32, 58, 78, 78

Dein Eingangsposting klang so, als hättest du schon einen Algorithmus - nur eben einen, der nicht gewährleistet, dass die Summanden verschieden sind:

Zitat:
Original von Tunarus
Ich setze das Ganze in einem VBA Makro in Excel um und habe das Makro soweit fertig.
Mir fehlt lediglich ein Algorithmus, der dafür sorgt, dass die Teile unterschiedlich groß sind.


Wenn du nicht mal den hast, dann gute Nacht - was hast du denn dann bisher vorliegen??? geschockt
 
 
Tunarus Auf diesen Beitrag antworten »

...hab´ich doch gesagt:

Zitat:
Original von Tunarus
Der von mir bisher verwendete Trick besteht darin, dass ich simplerweise die Eingabezahl durch die Anzahl der Summanden teile und mit diesem Mittel beginne zu rechnen:

(Mittel +1) + (Mittel - 1) + (Mittel + 2) + (Mittel - 2) ...


...das ist ja mein Problem. Versuch´ mir bitte einen Schubs in die richtige Denkrichtung zu geben.
Ich habe gerade mal ein wenig in deinen Beiträgen gestöbert, weil mich deine Antworten beeindruckt haben und dabei festgestellt, dass du es offensichtlich hasst, mundgerechte Lösungen zu präsentieren. Aber genug geschleimt... versuch´ meine grauen Zellen zu aktivieren und sei meine Muse. Vielleicht kommt mir dann ja die zündende Idee, wie ich die Summanden möglichst elegant finde. Augenzwinkern

Folgendes ist klar...

Bei 20 möglichen Summanden kann der minimale Summenwert 210 nicht unterschreiten (1+2+3+4+5+...+20=210)

In Excel sieht das Ganze bisher so aus:


Private Sub cmdBerechnung_Click()

'Variablen deklarieren
Dim dblEingabe As Double 'Eingabezahl
Dim dblTeiler As Double 'Anzahl der Ausgabewerte (=Teilerzahl)
Dim dblZaehler As Double 'Schleifenzähler
Dim dblWert As Double 'Eingabezahl in gleiche Ausgabewerte teilen

'Variablenwerte festlegen
dblEingabe = Cells(2, 1) 'Eingabewert = Zelle A2
dblTeiler = Cells(2, 2) 'Anzahl der Ausgabewerte = Teilerzahl in Zelle B2
dblZaehler = 2 'Schleife beginnt in Zeile 2
dblWert = dblEingabe / dblTeiler 'Gleiche Ausgabezahl ermitteln

'Bereich Schritt 1 in Zellen D2 : D21 löschen
Range("D2 : D21").Select
Selection.ClearContents

'Schritt 1 in Zelle D2 : D21 mit gleichem Ausgabewert befüllen
Do
Cells(dblZaehler, 4) = dblWert
dblZaehler = dblZaehler + 1
Loop Until dblZaehler - 2 = dblTeiler

'Bereich Schritt 2 in Zellen F2:F21 löschen
Range("F2:F21").Select
Selection.ClearContents

'Schleifenzähler für Bereich Schritt 2 auf die dritte Zeile setzen
dblZaehler = 3

'Gleiche Ausgabewerte verändern, so dass verschiedene Werte entstehen
'Das ist der Teil, der mir den Kopf zerbricht
For x = 2 To dblTeiler
Cells(x, 6) = VBA.Round(Cells(x, 4) + y)
x = x + 1
Cells(x, 6) = VBA.Round(Cells(x, 4) - y)
y = y + 1
Next x

'Aktive Zelle auf A3 setzen
Range("A3").Select

End Sub


Danke!
AD Auf diesen Beitrag antworten »

Na wenn's dir nur um irgendeine Aufteilung geht, dann nimm doch

1, 2, ... , n-1

als die ersten n-1 Summanden, und als n-ten Summanden wählst du den Rest, der zur Gesamtsumme fehlt.


Anscheinend hast du aber noch andere Kriterien, die du bisher noch nicht genannt hast: Sollen die Summanden womöglich eng beieinander liegen (also nahe am Mittelwert), trotzdem aber einander verschieden? Dann sag das doch.
Tunarus Auf diesen Beitrag antworten »

...im Prinzip würde das natürlich schon reichen und wäre auch einfach umzusetzen, aber hier gehts mir um die Knobelei, hinzubekommen, dass die Werte möglichst homogen sind, wobei ein Ausreißen um ein paar Zehner in höheren Bereichen sicher nicht tragisch wäre. Nur, 1-19 zu summieren und dann die restlichen 831 draufzuschlagen ist mir nicht elegant genug. Das war ja auch der Grund, warum ich den Thread ursprünglich in "Rätsel" eingeordnet hatte... quasi als Denksportaufgabe smile

Wenn dir also was einfällt, was mich auf die richtige Spur bringt, dann wäre ich dir dankbar. Ich könnte mich auch mal revanchieren, wenn du mal Probleme mit deinem PC hast - du findest mich ->hier<- oder ->hier<- als Moderator ebenfalls unter Tunarus. Augenzwinkern

[edit]
...schulligunck - hätt´ich wirklich sofort sagen müssen

Danke und Gruß,
Tunarus
AD Auf diesen Beitrag antworten »

Zitat:
Original von Tunarus
quasi als Denksportaufgabe smile

Eine Denksportaufgabe, wo der Helfer erraten soll, was der Fragesteller denkt aber nicht sagt - ja, das hatten wir schon öfter hier im Board. Augenzwinkern
Tunarus Auf diesen Beitrag antworten »

...ja - das kenn ich von unseren Foren... und jetzt mach ich´s selber. Hammer

Egal - ich probier noch ´n paar Einfälle durch. Wenn ich auf was stoße, melde ich mich nochmal.
Herzlichen Dank dennoch für deine Mühe und Geduld.

Gruß,
Tunarus
AD Auf diesen Beitrag antworten »

Na dann mal Butter bei die Fische:

Es geht also um möglichst gleichmäßige Summanden. Dann wieder mein Vorschlag von oben anhand des Beispieles der Aufteilung von 300 in 6 Summanden, nur eben jetzt die erste Stufe von mir selbst:

285 muss also in 6 möglichst Summanden aufgeteilt werden, gleiche Summanden werden zugelassen. Das sind naheliegenderweise gemäß die Werte

47, 47, 47, 48, 48, 48

Jetzt die Rücktransformation:

47, 47+1, 47+2, 48+3, 48+4, 48+5, also

47, 48, 49, 51, 52, 53

Gleichmäßiger wirst du es bei gleichzeitiger Forderung der Ungleichheit der Summanden nicht hinkriegen.

Ich könnte es auch allgemein für Summe bei Summanden hinschreiben, aber dann kritisierst du mich gleich wieder wegen "komplizierter Formeln", also lasse ich es lieber sein. smile
Tunarus Auf diesen Beitrag antworten »

...ich und dich kritisieren? Wie komm´ ich den dazu? Prost

Ernsthaft - wenn ich mein Makro in zwei Schleifen einbette, dann kann ich für alle Eingabewerte von 210 bis 1.000 sämtliche Summandenanzahl durchlaufen lassen, also alle 15.800 Möglichkeiten ( (1.000 - 210)*20) ). Dabei lasse ich das Makro dann drei Kriterien überprüfen:

1.) Ist ein Wert doppelt vorhanden?
2.) Ist ein Wert negativ?
3.) Ergibt sich durch die Rundung der Summanden ein anderer als der Eingabewert?

Und genau da liegt der Hase im Pfeffer...
Auf dem Papier kann ich leicht auch komplizierte Werte nähern, also beispielsweise Eingabe 586 und 16 Summanden ergibt das Mittel 36,625. Nun muss ich aber einen automatisierten Weg finden, auf die Summanden zu kommen, die ich dann mit deiner Formel in die unterschiedlichen Summanden wandeln kann, ohne gegen eine der drei oben genannten Kriterien zu verstoßen.

Aber du hast mich zur Lösung gebracht! Deine Formel mit dem Näherungswert und der Addition um die Werte zu verändern und damit unterschiedlich zu machen war der zündende Gedanke!
Ich habe es nun so gelöst (...nur der relevante Teil ohne Deklarationen):

If dblWert < 15 Then
For x = 3 To dblTeiler + 1
Cells(x, 6) = VBA.Round(x - 2)
Next x
Else
For x = 3 To dblTeiler + 1
Cells(x, 6) = VBA.Round(x + y)
Next x
End If

..zur Erklärung
Ich weise das Makro an, zu prüfen, ob der Wert Eingabe / Anzahl Summanden (...also das Mittel) kleiner ist als 15. Wenn das so ist, dann zähle ich schlicht von 1 nach oben bis Summanden -1 und setze als letztes die Differenz zur Eingabe drauf. Also

Eingabe = 220
Anzahl Summanden = 16
Mittel = 13,75 (...also kleiner als 15)

1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+100

...das ist dieser Teil:

If dblWert < 15 Then
For x = 3 To dblTeiler + 1
Cells(x, 6) = VBA.Round(x - 2)
Next x


Das mache ich zunächst deshalb, um nicht mit der von dir inspirierten weiteren Berechnung negative oder doppelte Summanden zu erhalten. Wenn das Mittel nämlich größer ist als 15, dann gehe ich so vor:


Else
For x = 3 To dblTeiler + 1
Cells(x, 6) = VBA.Round(x + y)
Next x
End If


"Y" ist ein Wert, den ich aus dem Mittel bestimme: "Mittel - 11" Ich ziehe vom Mittel 11 ab, und lege mit dem Summieren los, wobei ich bei jedem Durchlauf den nächsten Summanden um einen erhöhe:

Eingabe = 786
Anzahl Summanden = 19
Mittel = 41,3684210526316 (...und damit größer als 15)

41 (gerundet) - 11 = 30

...und ab geht die Luzie 18 Summanden und oben drauf wieder der Rest:
30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+93

Das ist ausreichend elegant um mein ästhetisches Empfinden zufrieden zu stellen.

Was soll ich sagen? Ich sag´ mal schlicht DANKE! Manchmal sieht man vor lauter Bäumen keinen Wald und dann braucht man jemanden mit einer guten Axt. Und jetzt werd´ ich mich erstmal entspannen...

Herzlichen Gruß,
Tunarus
AD Auf diesen Beitrag antworten »

Also ich würde gemäß meinem Verfahren eher die Aufteilung



vorschlagen, die scheint mir gleichmäßiger.


P.S.: Hast Glück, dass Kroatien - Türkei soooo langweilig ist. Augenzwinkern
Tunarus Auf diesen Beitrag antworten »

...langweilig? Das ändert sich gleich - dann gibt´s 11m-schießen. smile
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »