Knack die Nuß - (Rätselspaß für die ganze Familie)



Excel-Version: Versionsunabhängig
nach unten

Betrifft: Knack die Nuß - (Rätselspaß für die ganze Familie)
von: mattis
Geschrieben am: 18.07.2002 - 17:32:17

Hallo Rätselfreunde!

Ich habe eine spannende Aufgabe:

Ihr kennt doch sicherlich die Funktion eines
CD-Players, die dafür sorgt, dass diejenigen
Lieder zusammengesucht werden, die genau auf
eine Seite einer C90-Kassette!
(soll es ja auch noch geben) gehen.

Das ganze funktioniert in zwei Modi:
1.Modus: möglichst Reihenfolge beibehalten
2.Modus: beliebige Reihenfolge

Das Ergebnis des CD-Players ist faszinierend.
Der 2 Modus schafft es meist auf die Sekunde genau.
Sogar bei beliebig vorgegebener Zeit.

Es wäre doch klasse, wenn sich jemand darüber
mal den Kopf zerbrechen könnte und eine
Funktion schreibt, die aus einem vorgegebenen
Datenfeld diejenigen Datenzeilen zusammenstellt,
die dem Ergebnis am nächsten kommen.

Das Ganze ließe sich dann z.B. über den
Speicherbedarf auch auf CDs und Festplatten
übertragen (wäre doch ein super praktisches Tool).

Wer Zeit und Lust hat...
Bin leider erst VBEginner : )
...aber man wird doch mal inspirieren,
und von dem täglichen Workbooks.Add und =SUMME(A1;B1)
ect. ablenken dürfen. ; )

Gruß Mattis

nach oben   nach unten

nimm doch den Solver__o.T.
von: snickers
Geschrieben am: 18.07.2002 - 19:45:46

o.T. = ohne Text

nach oben   nach unten

Re: Knack die Nuß - (Rätselspaß für die ganze Familie)
von: Hans W Hofmann
Geschrieben am: 18.07.2002 - 21:04:57

Sowas gibt es schon. Allerdings mit einem anderen fachlichen Hintergrund: Die Anwendung simuliert eine Mehrkopfwaage, deshalb werden auch Überschreitungen der Zielsumme zugelassen - kann aber leicht geändert werden...

A1..A12 Zufällige Vorgaben
B1..B12 Ausgewähle Vorgaben für Summenbildung
A13 Zielvorgabe
A14 max. Anzahl der Summenglieder für Summenbildung
Achtung die Rechenzeit steigt polynomisch 2^n!

MS Excel von Hans W Hofmann an mattis
 AB
1=$A$15-1+($B$15-$A$15+1)*ZUFALLSZAHL()=TEIL($B$14;LÄNGE($B$14)-ZEILE()+1;1)*A1
2=$A$15-1+($B$15-$A$15+1)*ZUFALLSZAHL()=TEIL($B$14;LÄNGE($B$14)-ZEILE()+1;1)*A2
3=$A$15-1+($B$15-$A$15+1)*ZUFALLSZAHL()=TEIL($B$14;LÄNGE($B$14)-ZEILE()+1;1)*A3
4=$A$15-1+($B$15-$A$15+1)*ZUFALLSZAHL()=TEIL($B$14;LÄNGE($B$14)-ZEILE()+1;1)*A4
5=$A$15-1+($B$15-$A$15+1)*ZUFALLSZAHL()=TEIL($B$14;LÄNGE($B$14)-ZEILE()+1;1)*A5
6=$A$15-1+($B$15-$A$15+1)*ZUFALLSZAHL()=TEIL($B$14;LÄNGE($B$14)-ZEILE()+1;1)*A6
7=$A$15-1+($B$15-$A$15+1)*ZUFALLSZAHL()=TEIL($B$14;LÄNGE($B$14)-ZEILE()+1;1)*A7
8=$A$15-1+($B$15-$A$15+1)*ZUFALLSZAHL()=TEIL($B$14;LÄNGE($B$14)-ZEILE()+1;1)*A8
9=$A$15-1+($B$15-$A$15+1)*ZUFALLSZAHL()=TEIL($B$14;LÄNGE($B$14)-ZEILE()+1;1)*A9
10=$A$15-1+($B$15-$A$15+1)*ZUFALLSZAHL()=TEIL($B$14;LÄNGE($B$14)-ZEILE()+1;1)*A10
11=$A$15-1+($B$15-$A$15+1)*ZUFALLSZAHL()=TEIL($B$14;LÄNGE($B$14)-ZEILE()+1;1)*A11
12=$A$15-1+($B$15-$A$15+1)*ZUFALLSZAHL()=TEIL($B$14;LÄNGE($B$14)-ZEILE()+1;1)*A12
13500=SUMME(B1:BEREICH.VERSCHIEBEN(B1;A14-1;0))
148=Zielsumme(A1:BEREICH.VERSCHIEBEN(A1;A14-1;0);A13)
1530150

Finde die Summanden aus A1:A12 die die
Summe A13 möglichst genau abbilden!
A15 minimaler Vorgabe, B15 maximaler Vorgabe
Via VBA


Function ZielSumme(Bereich As Range, Ziel As Single)
'Berechnet alle Variationen der Summen über Bereich(1..n)
'und bestimmt die Summanden, deren Summe Ziel am nächsten kommt!
'Variationen der Summanden auf Binärbasis bestimmen:
'Die 2^n-1 Möglichkeiten werden als n-stellige binäre Zahl interpretiert
'und über i hochgezählt. Jedes Bit steht für einen Summanden aus Bereich.
'Die Laufvariable i wird bitweise maskiert und bindet bei gesetzem Bit
'einen Wert aus Bereich in die Summe ein.
'Rückgabewert ist ein String als binäre Zahl mit gesetztem Bit für die
'zu verwendenden Summanden
Dim As Integer, j As Integer, Summand As Integer
Dim As Long, mask As Long
Dim As Single, mindiff As Single
Dim minmask As String
 n = Bereich.Count: mindiff = Ziel
 For i = 1 To 2 ^ n - 1
    ZielSumme = "":  mask = 1: s = 0
    For j = 0 To n - 1
      Summand = (i And mask) / mask
      mask = mask * 2
      ZielSumme = Summand & ZielSumme
      s = s + Bereich(j + 1) * Summand
    Next
    If Abs(Ziel - s) < mindiff Then mindiff = Abs(Ziel - s): minmask = ZielSumme
    'If mindiff < 1 Then Exit Function ' Für Füllersimulation auf 1g genau genügt
 Next
ZielSumme = minmask
End Function

Gruß HW

nach oben   nach unten

Super Lösungen! Großes Lob!!!
von: mattis
Geschrieben am: 19.07.2002 - 11:03:22

Vielen Dank für eure Lösungen

Solver-Lösung:
Es hat etwas gebraucht bis ich die richtige Problemlösung gefunden hatte. Doch wen es interessiert:
unter http://www.excelformeln.de/tips.html?welcher=19
gibt's einen Lösungsansatz.

Funktion:
Funktioniert prima.
Allerdings sollte man den Kommentar

'If mindiff < 1 Then Exit Function

auskommentieren, sonst legt man den Computer
vorübergehend lahm ; )

Gruß Mattis

nach oben   nach unten

Re: Super Lösungen! Großes Lob!!!
von: Hans W Hofmann
Geschrieben am: 19.07.2002 - 13:41:57

Ajee,

wie soll ein Kommentar den Rechner lahmlegen, dass mußt Du genauer erklären?
Ich hab auch mit dem Solver experimentiert. Allerdings ist das Laufzeitverhalten noch schlechter. Aber für meine Verhältnisse reicht die Geschwindigkeit. Wenn aber die Industrie aufrüstet und weitere Wägeköpfe einrichtet, wird es Zeit die Funktion in eine DLL auszulagern...

Gruß HW


nach oben   nach unten

Re: Super Lösungen! Großes Lob!!!
von: Das Ergebnis zählt! Zeit 2t-rangig
Geschrieben am: 19.07.2002 - 15:27:18

Aber hallo!

Ich habe nicht gesagt, dass
der Kommentar den Computer lahmlegt,
sondern dass der User den Computer
lahmlegt, wenn er den Kommentar
nicht auskommentiert (um dadurch einen
Abbruch der Schleife zu ermöglichen).

Ich habe übrigends das Solverbeispiel
nun für CD-Track-Spielzeiten modifiziert.
Und ich weiß zwar, dass wir in einer hektischen
Zeit leben, aber die 7 Sekunden Rechenzeit für
eine brechend volle CD mit 30 Titeln finde ich
in Ordnung.

Schliesslich rechnet, wenn ich
das richtig begriffen habe, der Rechner
(2^30) = 1.073.741.824 Möglichkeiten durch.
Ich glaube da brauchen wir doch etwas länger.. ; )

Gruß Mattis


 nach oben

Beiträge aus den Excel-Beispielen zum Thema "Seite in UserForm aufrufen"