Autor Beitrag
olliterski
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105
Erhaltene Danke: 2

Win7 64-Bit
D7 Ent.
BeitragVerfasst: So 30.11.03 14:23 
Hi,

wie die Überschrift erkennen lässt handelt es sich um Lotto! :lol:

Diesmal aber etwas spezieller. Ich will nicht für alle 49 Zahlen sondern nur für, sagen wir mal, 20 Zahlen aus der Menge 1..49 alle Kombinationen darstellen. Günstig wäre ein Stringgrid da kann ich dann nämlich noch einige Werte berechnen und das ganze über die berechneten Werte filtern.

Frage ist nur wie kann man diesen Fall der Kombinatorik darstellen???

Ich hab mir schon den Kopf zerbrochen, angezündet und rauchen lassen, aber ich komm einfach nicht weiter. Vielleicht hat ja von euch einer ne Idee!?
Wenn jemand das ganze eventuell per SQL darstellen kann wäre das wirklich super, da die Anwendung eh komplett über die Datenbank laufen soll!!!

Viele Grüße

Oliver

PS: Ich habe auf Codefetzen verzichtet, da meine Ansätze vielleicht schon falsch sind. Ich würde aber gerne sehen wie ihr an dieses Problem herangehen würdet!

_________________
Viele Grüße
Oliver
Simon Joker
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 236
Erhaltene Danke: 1



BeitragVerfasst: Mo 01.12.03 17:10 
Hi olliterski

Dürfen Permutationen enthalten sein? Dann ist es sehr einfach. Du kannst dann jedes Element der Menge als Ziffer betrachten.
Beispiel 3 aus 10 -> Zeichen 0-9

ausblenden Quelltext
1:
2:
3:
4:
for i := 0 to 9 do
  for j := 0 to 9 do
    for k := 0 to 9 do
      CombiList.Add(IntToStr(i) + '/' + IntToStr(j) + '/' + IntToStr(k) );


Ohne Permutation ist es deutlich schwieriger.
Gleiches Beispiel:

ausblenden Quelltext
1:
2:
3:
4:
for i := 0 to 7 do
  for j := i+1 to 8 do
    for k := j+1 to 9 do
      CombiList.Add(IntToStr(i) + '/' + IntToStr(j) + '/' + IntToStr(k) );


Ich bin mir jetzt nicht ganzsicher, aber so müsste es in etwa hinkommen.
Wenn du andere Ziehungen willst, einfach Schleifenzahl und Grenzen ändern.
olliterski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105
Erhaltene Danke: 2

Win7 64-Bit
D7 Ent.
BeitragVerfasst: Mo 01.12.03 19:44 
Hi Simon,

vielen Dank für den Hinweis! Ich teste es gleich mal, obwohl ich schon etwas ähnliches bei SDC gefunden habe!

1. Problem
Es sollten eigentlich keine Permutationen sein! Beispiel: 20 Elemente und je Ziehung 6 Elemente. Macht summa summarum 27907200 Permutationen. Im Gegensatz dazu stehen die 38760 Kombinationen. Darunter kommen aber auch Sachen vor wie 1-4-6-13-20-41 = 20-4-1-41-13-6!!! Sortiert man die zweite Folge, so entspricht sie der ersten!

Ein berücksichtigen dieser Wiederholungen führt im Ergebnis zu Kombinationen. Jede Folge kommt also nur einmal vor.

Vorraussetzung, wiederholungen in einer Folge nach dem Muster: 1-4-6-4-13-20 darf es dabei nicht geben, sonst wäre es eine Variation mit Wiederholung!!!

Vorerst bin ich folgenden Lösungsweg gegangen:
1. fkt.-Struktur aus dem Programm, was man sich unter obigem Link runterladen kann, an meine Oberfläche angepasst. Damit ich wenigstens irgendwas habe!

2. anstatt "writeln(' {'+A+'} ')" schreibe ich die Werte in eine Datenbank
Beim Schreiben in eine Datei oder eine Listbox macht mein rechner trotz 1GB Ram nicht mit!

3. vor dem Schreiben prüfe ich jedoch, ob die zu schreibende Zeichenfolge vorhanden ist; dafür sortiere ich sie auch vorher! Prüfen mit 'Select', soriteren über eine zweite Listbox!

Jeder wird sich vorstellen können, was das für einen Radau im Prozessor verursacht!

Ich habe für meine Testphase einfach gesagt, ich gehe von 20 Zahlen aus.
Da die Fkt-Struktur (demo über Link) irgendwie mit zweistelligen Ziffern nicht zurechtkommt, habe ich kurzerhand die Ziffern 1-20 durch buchstaben ersetzt (A..T)! Nebenbei bemerkt,...
...1 Buchstabe = representiert irgendeine Zahl an der Position!!!
Beispiel:
In der jetzigen Fassung ist A die erste Zahl, B die zweite Zahl, ...usw
Die erste Zahl muss aber nicht 1 sein, die zweite nicht 2, usw. ...!
Zur darstellung der Kombinationen reichen mir die Buchstaben. Die kann ich später mit nem UPDATE durch Zahlen ersetzen. Entweder durch die endgültigen (A=2, B=5,...) oder durch die Position an der sie stehen (A=1, B=2,...). Aber das will ich jetzt auch nicht weiter breit treten, weil´s einfach langweilig ist! Es sei denn jemand besteht unbedingt darauf! :?:
Da das Programm seit 12:30 uhr ununterbrochen läuft und erst bei 'C..' angekommen ist, wird das wohl alles noch etwas dauern.
Liegt halt daran, das die Fkt. mir Permutationen liefert und ich aber die Kombiniationen rausfiltere um es eindeutig zu haben. Also 38760 aus 27907200!!!!

Hatte auch schon die Idee das ganze über SQL zu lösen - allerdings ohne konkrete Vorstellung wie. Diesen Ansatz habe ich jetzt und werde ihn sobald das hier durch ist auch umsetzen!

Trotzdem vielen Dank für den Tip

Viele Grüße

Oliver

PS: Selbst wenn es so aussehen mag, als wäre ich ziemlich weit, muss ich sagen ich habe noch viel arbeit vor mir und ich würde mich freuen wenn der eine oder andere noch die Idee oder den Tip für mich parat hat den ich brauche!!!

_________________
Viele Grüße
Oliver
Shark
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 87

98, XP
D3, D5, D7
BeitragVerfasst: Di 02.12.03 12:30 
Du hast doch oben schon die Lösung!

Wenn Du keine Permutationen haben willst und die Zahlen sortiert ausgegeben werden sollen, reicht das zweite Beispiel oben. Die linke Zahl ist immer die Kleinste usw. ...

PS. Hat bei mir mit 20 Möglichkeiten etwa 1sec gedauert, eine ListBox zu füllen mit den 38760 Einträgen
olliterski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 105
Erhaltene Danke: 2

Win7 64-Bit
D7 Ent.
BeitragVerfasst: Di 02.12.03 15:34 
Hi,

coole Sache das! 8)

Ich hab das ganze umgestrickt und mir die Daten gleich in die Datenbank geschrieben. Dauer ca. 3:30 Min!

Ich hab heute Nacht das Programm bei 36792 Datensätzen nach ich glaub 12 oder 14 Stunden abgebrochen!
Trotzdem hat mich die SQL Lösung interessiert!
Ergebnis:
6 Tabellen, gefüllt mit je 20 Zahlen. Über ein Select würde das ganze die Datenbank sprengen (reines Kreuzprodukt!, also ohne Verknüpfung der Tabellen!). Aus dem Ergebnis (27907200 Datensätze nach erstem Filter) die 38760 Datensätze rauszufiltern war per einfachem select nicht möglich, da das einen 'widetablesupport' erfordert hätte! (was auch immer das sein mag!). Nebenbei bemerkt war das Kreuzprodukt (als reines select) noch nicht mal bei 2 an der ersten Stelle und die Datenbank hatte schon die schwindelerregende Größe von knapp 2 GB (ASA8) bei knapp 3 Mio. Datensätzen!
Aber man hätte es auch über Views aus dem Kreuzprodukt verdichten können (cascadierende Views!).
Probiert hab ich das noch nicht, werd ich aber demnächst mal!

Simon, dir recht herzlichen Dank, für diesen einfachen aber effizenten Lösungsansatz!!!

Hatte schon die Hoffnung aufgegeben, das das Problem überhaupt derart einfach lösbar wäre!

Viele Grüße

Oliver

_________________
Viele Grüße
Oliver