Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Jul 17, 2025 23:07

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Listen Kombinationen berechnen
BeitragVerfasst: Di Feb 14, 2006 09:41 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Tach,

ich würde gern wissen, wie man vorgehen muss wenn man sogannte listen kombinationen berechnet.
Was ich damit meine, ihr habt ne liste mit beispielsweise 10 einträgen als checklistbox:

Code:
  1.  
  2. [ ] 1. Azumanga
  3. [ ] 2. Yohko
  4. [ ] 3. Naruto
  5. [ ] 4. Shana
  6. [ ] 5. Guu
  7. [ ] 6. Karin
  8. [ ] 7. Maze
  9. [ ] 8. Karas
  10. [ ] 9. Slayers
  11. [ ] 10. Tsubasa
  12.  


Was er nun machen soll, ist einfach alle möglichkeiten durchgehen welche man markieren kann und dann jede einzelne kombination speichern:

Würde so aussehen:

Kombination 1:

Code:
  1.  
  2. [x] 1. Azumanga
  3. [ ] 2. Yohko
  4. [ ] 3. Naruto
  5. [ ] 4. Shana
  6. [ ] 5. Guu
  7. [ ] 6. Karin
  8. [ ] 7. Maze
  9. [ ] 8. Karas
  10. [ ] 9. Slayers
  11. [ ] 10. Tsubasa
  12.  


Kombination 2:

Code:
  1.  
  2. [ ] 1. Azumanga
  3. [x] 2. Yohko
  4. [ ] 3. Naruto
  5. [ ] 4. Shana
  6. [ ] 5. Guu
  7. [ ] 6. Karin
  8. [ ] 7. Maze
  9. [ ] 8. Karas
  10. [ ] 9. Slayers
  11. [ ] 10. Tsubasa
  12.  


Kombination 3:

Code:
  1.  
  2. [ ] 1. Azumanga
  3. [ ] 2. Yohko
  4. [x] 3. Naruto
  5. [ ] 4. Shana
  6. [ ] 5. Guu
  7. [ ] 6. Karin
  8. [ ] 7. Maze
  9. [ ] 8. Karas
  10. [ ] 9. Slayers
  11. [ ] 10. Tsubasa
  12.  


Kombination 11:

Code:
  1.  
  2. [x] 1. Azumanga
  3. [x] 2. Yohko
  4. [ ] 3. Naruto
  5. [ ] 4. Shana
  6. [ ] 5. Guu
  7. [ ] 6. Karin
  8. [ ] 7. Maze
  9. [ ] 8. Karas
  10. [ ] 9. Slayers
  11. [ ] 10. Tsubasa
  12.  


Kombination 12:

Code:
  1.  
  2. [x] 1. Azumanga
  3. [ ] 2. Yohko
  4. [x] 3. Naruto
  5. [ ] 4. Shana
  6. [ ] 5. Guu
  7. [ ] 6. Karin
  8. [ ] 7. Maze
  9. [ ] 8. Karas
  10. [ ] 9. Slayers
  11. [ ] 10. Tsubasa
  12.  


Kombination 13:

Code:
  1.  
  2. [x] 1. Azumanga
  3. [ ] 2. Yohko
  4. [ ] 3. Naruto
  5. [x] 4. Shana
  6. [ ] 5. Guu
  7. [ ] 6. Karin
  8. [ ] 7. Maze
  9. [ ] 8. Karas
  10. [ ] 9. Slayers
  11. [ ] 10. Tsubasa
  12.  


Kombination 20:

Code:
  1.  
  2. [x] 1. Azumanga
  3. [x] 2. Yohko
  4. [x] 3. Naruto
  5. [ ] 4. Shana
  6. [ ] 5. Guu
  7. [ ] 6. Karin
  8. [ ] 7. Maze
  9. [ ] 8. Karas
  10. [ ] 9. Slayers
  11. [ ] 10. Tsubasa
  12.  



Kombination 20:

Code:
  1.  
  2. [x] 1. Azumanga
  3. [x] 2. Yohko
  4. [ ] 3. Naruto
  5. [x] 4. Shana
  6. [ ] 5. Guu
  7. [ ] 6. Karin
  8. [ ] 7. Maze
  9. [ ] 8. Karas
  10. [ ] 9. Slayers
  11. [ ] 10. Tsubasa
  12.  


usw.

So lange halt bis alle kombinationen durch sind.

Ich hab absolut kein plan wie ich bei sowas vorgehen soll.

Wäre echt dankbar für vorschläge.

Thx,
Final[/code]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 14, 2006 10:37 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Iterativ :twisted:
Nein, wirklich. bei einer Liste mit n Elementen gibt es 2^n Kombinationsmöglichkeiten. Du kannst also in einer Schleife von null nach 2^n-1 laufen und dann die ersten n Bits der Schleifenvariable auswerten. Wenn Bit k gesetzt, dann muss Listeneintrag k in das aktuelle Ergebnis.
z.B.: 15. Durchlauf:
Bits der Schleifenvariable (links niederwertig) 1111000000000000000 (sinds 32?)
=> Eintrag 1,2,3 und vier müssen in das 15. Ergebnis

22. Durchlauf:
Bits der Schleifenvariable: 01101000000000...
=>Eintrag 2,3 und 5 müssen ins Ergebnis.

Alle Ergebnisse schreibst Du dann in Deine Ergebnisliste.

p.s. ob Bits gesetzt sind, prüfst Du in einer zweiten Schleife mit
Code:
  1. If Loop1 And (1 shl Loop2) <>0
  2. Then Ergebnis[Loop1].Add(Liste[Loop2])
,
wobei Loop2 von 0 bis n läuft.

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 14, 2006 14:19 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wenn ich sowas sehe sträubt sich mir irgendwie alles. :x

Was ist dein Ziel? Sag mal um was es genau geht. Eventuell gibt es eine wesentlich pfiffigere Lösung als einen 2^n Algorithmus (Was wahrscheinlich ist).

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 14, 2006 15:43 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Ziel ist es nen tool zu bauen, welches die besten ergebnisse erzielt auszugeben, welche ordner am besten auf ne DVD passen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 14, 2006 16:04 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Dann hast du hier schon die Weg zur perfekten Lösung genannt bekommen.
Einzig für die Laufzeit ist es miserabel. Hier solltest du einen Algorithmus mit optimaler Lösung suchen.

Ansonsten bist du als Mensch schneller ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 14, 2006 17:13 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Für sowas sollte es Patentlösungen geben. Schließlich ist die Hauptspeicherverwaltung in Betriebssystemen ähnlich aufgebaut.

Is aber wirklich ein blödes Problem. Ob es in der TI für sowas einen standard-Algorithmus gibt? Ich frag mal einen unserer Übungsleiter...

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 14, 2006 17:26 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Flash hat geschrieben:
Schließlich ist die Hauptspeicherverwaltung in Betriebssystemen ähnlich aufgebaut.

Meines Wissens nach nicht. Es gibt zwar Verfahren wie Best Fit und Worst Fit, aber in der Praxis ist First Fit schneller. Auch werden die Daten in einzelne Speicherbereiche gelegt.
Da wird bei First Fit nur drauf geachtet ob sie passen.
Nur alle paar Jubelsekunden Wird der Speicher dann aufgeräumt/die Speicherbereiche neu indexiert.
Jedenfalls meinem Wissen aus Info 3 nach.

Habe gerade auch nachgeschaut. Laut Skript wird dynamische Speicherverwaltung und First Fit meistens eingesetzt.
Darunter folgt der Satz, dass ältere Unix-Systeme damit arbeiten :?

Aber egal. Wir haben ein anderes Problem.
Beim Speicher bekommen wir ein Fragment/Ordner der irgendwo am besten reinpassen soll.
Hier haben wir die Ordner schon und schauen wie die am besten zusammenpassen, damit sie exact X MB Speicherplatz belegen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 14, 2006 21:04 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Jo..hab ich mir auch überlegt. Deshalb die Frage an meinen TI Übungsleiter. Er hat noch nicht geantwortet. Wenn, dann schreib ichs hier rein.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 14, 2006 21:15 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Ist das nicht ähnlich wie diese Rucksatz-Packen-Problem (KNAPSACK) ? Das war doch glaube ich eins von diesen Problemen, für die es keinen schnellen Algorithmus gibt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Feb 14, 2006 21:20 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Es ist DAS Problem ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 15, 2006 09:25 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Code:
  1. Wiederhole
  2.   Wiederhole
  3.     nimm größte Feile, die noch draufpasst
  4.     und stecke sie in DVD
  5.   bis DVD voll oder keine Feile mehr
  6. bis keine Feile mehr

liefert nicht die beste, aber immerhin ne gute Lösung

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 15, 2006 10:59 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Also hab deine erste möglichkeit mal ausprobiert, aber irgendwie wenn ich das ganze umsetzte, funzt es nur halbwegs... er lässt einfach einträge aus :(
Teilweise gehts, aber nich so richtig.

Also beispielsweise hab ich hier 28 einträge, 2^28 wäre 784, also müsste es ja so aussehen:

Code:
  1.  
  2. procedure CalculateDirs(_srclst : TList; var _dstlst : TList; _maxspace : Int64);
  3. var
  4.   Count    : Longint;
  5.   N        : Longint;
  6.   Loop1,
  7.   Loop2    : Longint;
  8.   Size     : Int64;
  9.   Ergebnis : array of TList;
  10.   ErgList  : TList;
  11. begin
  12.   Count := _srclst.Count; // N
  13.   N := FacIterative(Count, 2); // 2^N
  14.  
  15.   // Alle möglichkeiten berechnen
  16.   SetLength(Ergebnis, N);
  17.   For Loop1 := 0 to N-1 do
  18.     Ergebnis[Loop1] := TList.Create;
  19.  
  20.   For Loop1 := 0 to N-1 do
  21.   begin
  22.     For Loop2 := 0 to Count do
  23.     begin
  24.       If Loop1 And (1 shl Loop2) <> 0 Then
  25.       begin
  26.         Ergebnis[Loop1].Add(_srclst.Items[Loop2]);
  27.       end;
  28.     end;
  29.   end;
  30.  
  31.   // Möglichkeiten nun prüfen
  32.   For Loop1 := 0 to N-1 do
  33.   begin
  34.     Size := CalcList(Ergebnis[Loop1]);
  35.     if (Size > 0) {and (Size <= _maxspace)} then
  36.     begin
  37.       ErgList := CopyList(Ergebnis[Loop1]);
  38.       _dstlst.Add(ErgList);
  39.     end;
  40.   end;
  41.  
  42.   // Möglichkeiten killen
  43.   For Loop1 := 0 to N-1 do
  44.     Ergebnis[Loop1].Free;
  45. end;
  46.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 15, 2006 14:35 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Was macht denn FacIterative?
Falls die Funktion ne Fakultät berechnet, dann isses die falsche Wahl
Die Funktion, die Potenz zu berechnen heisst IntPower in der Unit Math.
Wenn Du alles in eine Schleife packst, dann sparst Du Dir viel Rechanzeit:
Code:
  1.      
  2. procedure CalculateDirs(_srclst : TList; var _dstlst : TList; _maxspace : Int64);
  3. var
  4.   Count : Longint;
  5.   N : Longint;
  6.   Loop1,
  7.   Loop2 : Longint;
  8.   Size : Int64;
  9.   Ergebnis : TList;
  10. begin
  11.   Count := _srclst.Count; // N
  12.   N := Integer(Trunc(IntPower(2.0,Count))); // 2^N
  13.   // Alle möglichkeiten berechnen
  14.   For Loop1 := 0 to Pred(N)
  15.   do begin
  16.     Ergebnis:=TList.Create;
  17.     For Loop2 := 0 to Pred(Count)
  18.     do begin
  19.       If Loop1 And (1 shl Loop2) <> 0
  20.       Then Ergebnis.Add(_srclst.Items[Loop2]);
  21.     end;
  22.     // Möglichkeit nun prüfen
  23.     Size := CalcList(Ergebnis);
  24.     if (Size > 0) {and (Size <= _maxspace)}
  25.     then _dstlst.Add(Ergebnis)
  26.     else Ergebnis.Free;
  27.   end;
  28.   Ergebnis.Free;
  29. end;
  30.  

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 15, 2006 20:09 
Offline
DGL Member

Registriert: Do Dez 01, 2005 12:55
Beiträge: 41
Ich würde mir hier weniger Gedanken darüber machen, ob ich nicht vielleicht einen anderen Algorithmus finde, der das Gleiche effizienter erledigt, sondern mich entweder um alternativen Näherungen oder um Laufzeitersparnisse für den jetzigen Algorithmus kümmern.

Es macht zum Beispiel keinen großen Sinn jede Liste erstmal fertigzustellen und dann zu gucken ob die Größe überschritten wurde.
am besten ist, man zählt schön während dem Aufbau jeder Liste mit bei welchem Volumen man sich befindet und kann dann abbrechen, wenn man weiß, dass man in diesem Durchgang bereits über der maximalgröße ist. Ein weiterer Vorteil, den diese Veränderung hat ist folgender: Angenommen ich bin bei dieser Kombination angelangt:

00111010111010101111

Jetzt merke ich nach den ersten drei einsen, dass ich bereits die Maximalgröße überschritten habe, dann weiß ich auch, dass keine weitere zahl passen wird, bis ich nicht mindestens diese dritte eins in eine null verwandelt habe.

Subtrahiere jetzt also meinen derzeitigen Zähler von 00110000000000000000 und addiere die Differenz auf den Zähler.

Dazu muss ich dann natürlich mit while-Schleifen arbeiten.

Ich hoffe mal das ist kein Humbug den ich mir da grad ausgedacht hab. :roll:

Wenn ich nicht unbedingt immer das 100%ige Ergebnis haben muss, sondern eine Näherung es auch tut, kann man sich natürlich jede Menge alternative Algorithmen ausdenken, die andere Prioritäten haben, z.B. möglichst viele Pakete unterbringen, oder gemischte Größen etc.

Gruß
Jan


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 15, 2006 23:04 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Nö isses nicht. Backtracking wird bei exponentiellen Algorithmen meist zur schadensbegrenzung eingesetzt. Man kann im durchschnittsfall ne Menge Zeit sparen, aber im Worstcase bleibt alles wies ist.

Backtracking ist ne gute idee. Sobald du eine Kombination gefunden hast, die nicht passt, dann passen alle anderen Kombinationen, die diese kombination beinhalten auch nicht.
Du könntest also die letzte Entscheidung Rückgängig machen, ein Flag setzen, dass das Bit xyz nicht wieder gesetzt werden darf, und was anderes ausprobieren. Wenn du rekursiv (erfolglos) zurück kommst, löscht du das Flag wieder, löscht ein anderes Bit, und setzt dessen Flag. Ich denke so könntest du dir ne Menge Zeit ersparen.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 14 Queries | GZIP : On ]