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

Aktuelle Zeit: Do Jul 17, 2025 07:44

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



Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 16, 2006 01:07 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Also es funktioniert jetzt, aber sobald 2^n die Int64 grenze überschreitet, das wären halt schon 63 einträge 2^63 ist nämlich der bereich der geht :(
Dann raucht er ab, und wenn ichs beispielsweise n = High(int64) nehme, falls 63 einträge überschritten werden dann brauch er jahre das durchzulaufen.

Da bleibt in der hinsicht erstmal nur eins übrig, wenn wer einträge reinmacht mit mehr als 63 verzeichnisse dann wird N auf 300000000 (2^28.irgendwas) gesetzt.
Das würde noch relativ flott durchlaufen aber lässt dann natürlich massig an möglichkeiten aus.

Der algo ist zwar ok, aber in der hinsicht schlecht wenns mehr als 63 einträge sind.
Sinnvollerweise sollte sogar das Limit auf 29 einträge gemacht werden, weil ne halbe millarde an schleifendurchläufe dauert schon zu lange.

Reicht aber aus denk ich mal, ich hab ja extra Excludes eingebaut, damit er nicht alle verzeichnisse liesst und gleich mal ne dicke warnung wenn mehr als 29 einträge sind ;)

Hier ist das tool welches ich nun erstellt hab: http://xenorate.com/final/programs/dvdcalc.zip

Trotzdem danke.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 16, 2006 13:16 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hast du's mit Backtracking gemacht?

Ich hab gestern bevor ich eingeschlafen bin nochn bisl drüber anch gegrübelt. Der Test ob eine Nichtfunktionierende Kombination in der aktuell zu betrachtenden enthalten ist könnte per bitoperator implementiert werden und so aussehen:

Code:
  1. for i := 0 to AnzNichtMoeglicheKombinationen do
  2.   if ((aktCode bitAnd NMKombis[i]) bitAnd NMKombis[i]) = NMKombis[i] then breche ab.


Wenn du dazu noch versuchst immer die größten Verzeichnisse zuerst einzlagern, dann solltest du ne Menge aussschließen könne.

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


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

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
So hier mal die antwort meines TI-Übungsleiters:
Zitat:
Hi Kevin,

Kevin Fleischer schrieb:
> In einem Forum in dem ich öfters unterwegs bin kam die Frage auf, wie man die beste auslastung von DVDs berechnen kann.
> Und zwar hat der betreffende eine Menge Ordner unterschiedlicher größe und möchte die auf möglichst wenige DVDs brennen. Wie kann man das bestimmen?

Der "offizielle" Name dafür dürfte "BinPacking" sein. Nun ist die Frage,
ob die Menge der Dateien endgültig ist oder ob im Laufe der Zeit immer
neue Dateien hinzukommen. In letzterem Fall wäre es dann ein
"Online-Problem".
So richtig kenne ich mich nicht aus. Was mir einfällt ist folgendes.
Zunächst einmal für die Offline-Variante (man weiß, daß nichts mehr
dazukommt):
Das kann man sehr effizient approximieren. Die Objekte (Dateien) der
Größe nach absteigend sortieren. Dann vorne anfangen und das Objekt in
den ersten Behälter (DVD) packen, wo es reingeht. Dann das zweitgrößte
Objekt, usw. Solange wiederholen, bis alle Objekte verteilt sind. Damit
erhält man eine Güte von 2. Das heißt man benötigt maximal doppelt so
viele DVD's wie nötig wären. Das ist "in echt" natürlich ein ziemlicher
Verschnitt, dafür geht es schnell.
Will man die optimale Lösung, dann muß man zu den langsamen Algorithmen
greifen. Außer Brute-Force fällt mir da nicht viel ein. Es gibt sicher
auch Ansätze mit dynamischer Programmierung. Das ist dann zwar auch noch
exponentiell aber besser ;)
Möglicherweise funktioniert Branch-and-Bound auch gut. Müßte man mal
ausprobieren. Schranken fallen mir zwar ein, aber es ist mir zu
kompliziert zu schreiben ;) Ich denke, Du findest im Netz einiges dazu.

So, jetzt ein paar Gedanken zur Online-Variante.
Wenn immer wieder neue Objekte hinzukommen, kann man aus einer
Momentaufnahme natürlich keine optimale (Global-)Lösung konstruieren.

Ich habe sowas vor einiger Zeit mal realisiert (ob ich dabei gute Ideen
hatte, sei dahingestellt ;) )
Zuerst das Ergebnis, wenn Du damit unzufrieden bist, mußt Du nicht
weiterlesen ;)
Meine Objekte waren zwischen 500MB und 1,8 GB groß. Wenn ich >=11
Objekte zur Verfügung standen, füllte der Alg. mindestens eine DVD so,
daß maximal 10 MB frei blieben (oft < 1MB). Also ein Verschnitt im
Promille-Bereich.
Ich habe mir keine Mühe beim Optimieren gegeben (und Java benutzt ;) ),
daher war bei >20 Objekten meist Schluß, jedenfalls hat es dann schon
Minuten gedauert und so lange wollte ich nicht warten.
Also hab ich immer nur 18-19 Objekte zur Verfügung gestellt und der Alg.
hat mir zwei bis drei DVD's "praktisch randvoll" gepackt und dann habe
ich die nächsten Objekte nachgeschoben. Im Rückblick bin ich sehr
zufrieden, die 10MB Grenze hielt die ganze Zeit stand.

Nun die Idee:

Zuerst habe ich die Anzahl der nötigen DVDs trivial nach oben
beschränkt: Wenn die k größten Objekte auf eine DVD passen, brauche ich
maximal #Objekte/k DVDs. Je kleiner diese Schranke, um so schneller geht
der Algorithmus. Aber man darf nicht zu genau werden, sonst kriegt man
viele DVDs relativ voll. Da Online-Variante, ist mir aber wichtiger,
einige DVDs ganz voll zu machen. Die anderen will ich ja mit Objekten
der Zukunft füllen.

Angenommen, wir haben n Objekte und m Behälter zur Verfügung. Nun will
ich ja eine Lösung, wo vor allem die ersten Behälter möglichst voll sind.
Angenommen, wir haben eine zulässige Verteilung V der Objekte. Dann
bewerte ich V durch f(V)=\sum_{i=1}^m i*#(freie Bytes in Behälter i).
Und nun suche ich die Verteilung V' mit maximalem f. Dadurch wird vorne
möglichst dicht gepackt und die hinteren Behälter bleiben eher leer.
Will man diesen Effekt verstärken, kann man aus i auch i^2 machen. Zum
Abschwächen irgendetwas <<i nehmen (log i, \sqrt i oder so).

Nun suche ich also per Backtracking nach V'. Da das sehr lange dauert,
führe ich noch S(V) mit, eine obere Schranke an f. Dazu berechne ich S,
sobald ich ein weiteres Objekt verteilt habe. S arbeitet also auf
partiellen Verteilungen. Es nimmt an, daß die Restobjekte optimal auf
die ersten Behälter verteilt werden können (so als wären sie flüssig)
und berechnet dann f von der fiktiven Verteilung. Dadurch kann ich eher
abbrechen, wenn ich bereits in einem anderen Ast eine bessere Verteilung
gefunden habe. Diese Schranke kann man noch verfeinern, aber es ist mir
wieder zuviel Schreibaufwand ;)
Das ganze funktioniert also ein bißchen wir Branch-and-Bound, bloß ohne
"Branch" :)
Das Branchen würde sich aber lohnen, denke ich, obwohl es sehr zu Lasten
des Speichers gehen würde.

Für weiter Details oder "Philosophien" kommste bitte in mein Büro,
E-Mail schreiben dauert länger als reden. :)

Ich hoffe, einen kleinen Einblick gegeben zu haben. Zumindest hast Du
die wesentlichen Begriffe, um im Netz weiterzugucken.

Viele Grüße
Andre'

_________________
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 Vorherige  1, 2
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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.015s | 15 Queries | GZIP : On ]