Ich habe eine Reihe von Mediendateien, die ich auf DVD aufnehmen möchte, aber da jede DVD nur 4,5 GB groß ist, muss ich den optimalen Weg finden, um die Dateien so zu organisieren, dass die minimale Anzahl von DVDs verwendet wird (andernfalls der jeweils verbleibende leere Speicherplatz DVD kann sich leicht summieren). Gibt es irgendwelche Tools, die dabei helfen?
Vor vielen Jahren gab es ein DOS-Dienstprogramm, um dies mit Disketten zu tun.
Antworten:
Probieren Sie die kostenlose DVD Span :
quelle
Ah, das Rucksackproblem . Ich konnte hier nur einen Online-Löser dafür finden . Ihre Rucksackgröße wäre 4,5 GB, und jedes Paket wäre Ihre Dateigröße. Sie müssen die Ausgabe ein wenig massieren, um sie an Ihre spezielle Anwendung anzupassen, aber sie sollte funktionsfähig sein. Dies wird jedoch nicht sehr schnell laufen, da dieses Problem schwierig ist .
quelle
Überblick
Jeff Shattocks Antwort ist richtig, dass dies einem kombinatorischen Optimierungsproblem entspricht (oder isomorph ist, wie Mathematiker schreiben), aber es entspricht dem Problem der eindimensionalen Behälterverpackung , nicht dem Rucksackproblem .
Zum Glück muss ich Code freigeben, der dieses Problem für Sie oder andere Personen mit Zugriff auf einen Windows-Computer mit mindestens Version 3.5 von .NET Framework löst.
Eine grobe Lösung
Laden Sie zunächst LINQPad herunter und installieren Sie es .
Laden Sie zweitens die LINQPad-Abfrage herunter, die ich gerade geschrieben habe - hier ist der Linq (ha) zur Rohdatei. Speichern Sie es als .linq- Datei und öffnen Sie es in LINQPad.
Ändern Sie die Parameter:
Hier ist der Teil im LINQPad-Abfragecode, den Sie ändern sollten:
int binSizeMb = 4476; // This is the (floor of the) total size of a DVD+R reported by CDBurnerXP. string rootFileFolderPath = @"F:\2006 - Polyester Pimpstrap Intergalactic Extravaganza multicam";
Ändern Sie
binSizeMb
die Größe Ihres 'Fachs', z. B. CD, DVD, z.int binSizeMb = 650;
für eine CD.Hinweis - Der
binSizeMb
Wert wird als das interpretiert, was manchmal als Mebibyte bezeichnet wird . Im Gegensatz zu meiner Kindheit, als alle Byte-Vielfachen "binär" waren, bezieht sich "MB" manchmal auf ein "dezimales Megabyte" oder genau 1.000.000 Bytes, im Gegensatz zu den 1.048.576 Bytes eines Mebibytes (MiB), die in meinem Code verwendet werden . Wenn Sie dies ändern möchten, ändern Sie die Zeileconst int bytesPerMb = 1048576;
im Code inconst int bytesPerMb = 1000000;
.Wechseln Sie
rootFileFolderPath
in den vollständigen Pfad des Ordners mit den Dateien, die Sie in Bins packen möchten, z.string rootFileFolderPath = @"C:\MySecretBinFilesFolder";
.Führen Sie die Abfrage aus, indem F5Sie oben links auf der Registerkarte "Abfrage" auf die Schaltfläche " Ausführen" klicken oder darauf klicken .
Ergebnisse
Der Abfragecode listet
rootFileFolderPath
rekursiv alle Dateien im Ordner auf, dh er enthält auch Dateien in allen Unterordnern.Anschließend werden "Bins" für die Dateien erstellt, sodass die Gesamtgröße aller Dateien in jedem Bin kleiner oder gleich der angegebenen Bin-Größe ist.
Im LINQPad-Ergebnisbereich werden zwei Listen angezeigt.
Die erste Liste enthält alle gefundenen Dateien, die in absteigender Reihenfolge nach Größe aufgelistet sind.
Die zweite Liste enthält die durch "Packen der Dateien" erstellten Fächer mit einer Liste der Dateien und ihrer Größe sowie der verbleibenden Größe des Fachs.
Hier ist ein Screenshot mit der zweiten Liste und den ersten beiden erstellten Behältern:
Flüchtige Analyse
Laut Wikipedia sollte der von mir verwendete Algorithmus - die FFD-Strategie (First Fit Decreasing) - nicht schlecht sein. Wikipedia sagt:
'OPT' bezieht sich auf die optimale Strategie (als etwas, das möglicherweise nicht erreichbar ist, nicht als eine bestimmte tatsächliche Strategie).
Basierend auf meinen etwas unscharfen Erinnerungen an die beteiligten mathematischen Begriffe sollte dies bedeuten, dass die FFD-Strategie im schlimmsten Fall Elemente in das 1,22-fache der Anzahl von Behältern packen sollte, die eine optimale Strategie bieten würde. Diese Strategie könnte also Artikel in 5 statt in 4 Fächer packen. Ich vermute, dass die Leistung mit Ausnahme bestimmter „pathologischer“ Artikelgrößen wahrscheinlich nahezu optimal ist.
Der gleiche Wikipedia-Artikel besagt auch, dass es einen "exakten Algorithmus" gibt . Ich kann mich auch dafür entscheiden, dies umzusetzen. Ich muss zuerst das Papier lesen, das den Algorithmus beschreibt.
quelle
Sie können jedes Komprimierungswerkzeug verwenden, das das Aufteilen eines Archivs ermöglicht, denke ich
quelle
Sie können eine der Varianten des Programms in Hitchhikers Leitfaden für Haskell übernehmen , möglicherweise nachdem Sie einen Teil dieses Tutorials durchgearbeitet haben. Das Tutorial befasst sich mit der Lösung genau Ihres Problems, Dinge auf mehrere Festplatten zu verteilen, wobei die Lösung schrittweise verfeinert wird, wie in der folgenden Passage aus Kapitel 3 des Tutorials veranschaulicht :
Weitere Ideen: eine verwandte Frage
Hier ist eine ähnliche Frage (obwohl nicht dieselbe: Sie wird dort nicht zur Optimierung gestellt), wo Sie möglicherweise nützlichere Lösungen / Programme für Ihre Aufgabe finden (falls sie veröffentlicht werden):
Einige Hinweise zum Verständnis der Programmierung finden Sie im vorgeschlagenen Lernprogramm
Im Allgemeinen ist der Haskell-Code sehr ausdrucksstark (da Haskell eine Programmiersprache auf einem hohen Abstraktionsniveau ist) und kann daher leicht verstanden werden.
Denken Sie beim Betrachten des Codes einer der Lösungen daran, dass die Struktur des Programms, das wir auf oberster Ebene schreiben möchten, recht einfach ist, wie in Kapitel 1 des Lernprogramms beschrieben:
und schauen Sie sich die Teile der Lösung genauer an.
quelle
Vor langer Zeit habe ich ein PHP-Skript geschrieben, um diese Aufgabe zu erledigen: https://bitbucket.org/borszczuk/php-backup-maker/
quelle
Versuchen Sie auch Discfit, mit dem Dateien und Verzeichnisse ausgewählt werden, die auf verschiedene Festplatten kopiert werden sollen:
https://sourceforge.net/projects/discfit/
quelle