Autor |
Beitrag |
Pr0g3r
      
Beiträge: 44
Win XP
Turbo Pascal, Delphi 5&7, Ti-Basic
|
Verfasst: Do 20.05.10 14:44
Hallo Leute,
Wir schreiben eine Projektarbeit über das Rucksackproblem. Wir suchen aber neben den evolutiönären und den dynamischen Algorithmus noch weitere Optimierungen. Kann mir jemand evtl einen link schicken oder das ganze gleich posten?
Bin für jede hilfe dankbar Moderiert von Narses: Topic aus Sonstiges (Delphi) verschoben am Do 20.05.2010 um 15:56
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Do 20.05.10 14:49
|
|
Pr0g3r 
      
Beiträge: 44
Win XP
Turbo Pascal, Delphi 5&7, Ti-Basic
|
Verfasst: Do 20.05.10 14:51
wie oben beschrieben, haben wir das dynamische schon ... -.-
_________________ Ultra posse nemo obligatur.
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Do 20.05.10 14:55
Hallo und  in der Entwickler-Ecke,
Mir stellt sich dann erstmal die Frage: Gibt es überhaupt noch andere "Optimierungen" dafür? Muss das unbedingt optimal gelöst werden, oder könnt ihr auch Näherungsverfahren (Greedy) besprechen und zeigen, dass ein Greedy-Ansatz (nicht?) beliebig schlecht sein kann?
_________________ We are, we were and will not be.
|
|
Pr0g3r 
      
Beiträge: 44
Win XP
Turbo Pascal, Delphi 5&7, Ti-Basic
|
Verfasst: Do 20.05.10 15:00
Ich weiß nicht, ob es noch Optimierungen gibt. Greedyverfahren sind auch ok, das Evolutionsverfahren gibt ja auch nicht immer die exakte Lösung aus.
Am Ende wollen wir ein Paar Verfahren vergleichen und dann gucken, welches am schnellsten und besten ist.
_________________ Ultra posse nemo obligatur.
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Do 20.05.10 18:16
hi
Sehr ergiebig, ist auch oftmals die Betrachtung der Englischen und Deutschen Wikipedia: Während die Deutsche sehr genau und kurz ist, ist die Englische oftmals etwas umfangreicher.
lg,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Pr0g3r 
      
Beiträge: 44
Win XP
Turbo Pascal, Delphi 5&7, Ti-Basic
|
Verfasst: Do 20.05.10 19:50
"George Dantzig proposed (1957) a greedy approximation algorithm to solve the unbounded knapsack problem. His version sorts the items in decreasing order of value per unit of weight, vi / wi. It then proceeds to insert them into the sack, starting with as many copies as possible of the first kind of item until there is no longer space in the sack for more. Provided that there is an unlimited supply of each kind of item, if m is the maximum value of items that fit into the sack, then the greedy algorithm is guaranteed to achieve at least a value of m / 2. However, for the bounded problem, where the supply of each kind of item is limited, the algorithm may be far from optimal."
Bedeutet das jetzt, dass er für jedes Element das Verhältnis wert zu Masse berechnet hat und dann solange die mit dem besten Verhältnis in den Sack gestopft hat, bis er voll ist?
_________________ Ultra posse nemo obligatur.
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Do 20.05.10 19:57
Exakt  .
_________________ >λ=
|
|
Pr0g3r 
      
Beiträge: 44
Win XP
Turbo Pascal, Delphi 5&7, Ti-Basic
|
Verfasst: Do 20.05.10 20:01
Ich hab es mal programmiert, es funktioniert tatsächlich ganz gut. Hat bei 1.000.000 ELementen mit einer Gewichtsbeschränkung von 2.000.000 1.998.999 rausbekommen.
Gibt es noch andere Methoden?
_________________ Ultra posse nemo obligatur.
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Fr 21.05.10 12:12
Hallo,
und was heißt das:
Zitat: | mit einer Gewichtsbeschränkung von 2.000.000 1.998.999 rausbekommen. |
Waren die übrig geblienbenen Elemente jetzt alle schwerer als 2.000.000-1.998.999=1001 kg?
Sonst hätte mindestens eins noch Platz gehabt.
Gruß Horst
Ok, negativer Wert wäre noch eine Möglichkeit, stände aber bestimmt nicht auf der Liste
|
|
gfoidl
      
Beiträge: 157
Erhaltene Danke: 19
Win XP
C#, Fortran 95 - Visual Studio
|
Verfasst: Fr 21.05.10 12:57
Hallo,
Zitat: | Wir suchen aber neben den evolutiönären und den dynamischen Algorithmus noch weitere Optimierungen. |
Simulated Annealing könnte auch dafür verwendet werden. Und somit auch alle verwandten wie der Sintflutalgorithmus, etc.
mfG Gü
_________________ Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Fr 21.05.10 13:30
Oder negative Masse  Da würde der Algo sogar einen kolossalen Fehler machen =D
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Pr0g3r 
      
Beiträge: 44
Win XP
Turbo Pascal, Delphi 5&7, Ti-Basic
|
Verfasst: Fr 21.05.10 14:46
Danke erstmal für eure Hilfe
Horst_H hat folgendes geschrieben : | Hallo,
und was heißt das:
Zitat: | mit einer Gewichtsbeschränkung von 2.000.000 1.998.999 rausbekommen. |
Waren die übrig geblienbenen Elemente jetzt alle schwerer als 2.000.000-1.998.999=1001 kg?
|
Damir war gemeint, dass das Tragelimit bei 2.000.000 lag und der Algorithmus hat 1.998.999 rausbekommen. Ich habe die Liste in einer For-Schleife mit Array[Schleifenvariable].wert = Schleifenvariable. VOn da her war kein Element mit 1001 kg mehr frei. Daswegen finde ich, dass das für eine Nährungslösung eigentlich gar nicht schlecht ist.
Laut wikipedia ist der Sinnflutalgo genauer als das simulierte abkühlen.
Der ist so beschrieben:
"
Wähle einen anfänglichen Schwellwert T > 0
Wähle einen Schwellwertfaktor TF (0 < TF < 1)
Wähle eine Zahl von Probierschritten Zmax
Wähle eine anfängliche Konfiguration C
Referenzlösung C_ref := C
Wiederhole bis Abbruchbedingung erfüllt
Wiederhole Zmax mal
Wähle neue Konfiguration C' (ausgehend von C)
Falls Qualität(C´) > Qualität(C_ref)
C_ref := C´
dQ := Qualität(C') - Qualität(C)
Falls dQ > -T
C := C'
T := T * TF
Gib C_ref aus
"
Was ich noch nicht verstehe ist, wie man am Anfang Zmax festlegt. 
_________________ Ultra posse nemo obligatur.
|
|
gfoidl
      
Beiträge: 157
Erhaltene Danke: 19
Win XP
C#, Fortran 95 - Visual Studio
|
Verfasst: Fr 21.05.10 15:29
Hallo,
Zitat: | Laut wikipedia ist der Sinnflutalgo genauer als das simulierte abkühlen. |
Das kommt schon sehr auf die Wahl der Parameter an. Nur weil in Wiki steht: Zitat: | Experimente der Erfinder deuten außerdem darauf hin, dass die Schwellenakzeptanz unter vergleichbaren Bedingungen häufig qualitativ bessere Lösungen liefert als die simulierte Abkühlung. |
heißt das noch nichts. Die Erfinder werden ja auch nicht ihrer Erfinden den Nachzug geben
Zmax ist eben so ein Parameter der festgelegt werden muss. Die korrekte Wahl kann nur durch Probieren ermittelt werden.
mfG Gü
_________________ Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!
|
|
Pr0g3r 
      
Beiträge: 44
Win XP
Turbo Pascal, Delphi 5&7, Ti-Basic
|
Verfasst: Fr 21.05.10 15:31
und wie probiert man das aus?
|
|
gfoidl
      
Beiträge: 157
Erhaltene Danke: 19
Win XP
C#, Fortran 95 - Visual Studio
|
Verfasst: Fr 21.05.10 15:49
Pr0g3r hat folgendes geschrieben : | und wie probiert man das aus? |
- nimm eine Zahl
- führe den Algorithmus aus
- ist das Ergebnis zufriedenstellend? Falls ja Ende des Probierens, falls nein gehe zu Punkt 1
SCNR
mfG Gü
_________________ Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!
|
|
Pr0g3r 
      
Beiträge: 44
Win XP
Turbo Pascal, Delphi 5&7, Ti-Basic
|
Verfasst: Fr 21.05.10 15:52
mmh
gibt es da nichts eleganteres, womit man am Anfang berechnen kann, wie viele Durchläufe man ca braucht?
|
|
gfoidl
      
Beiträge: 157
Erhaltene Danke: 19
Win XP
C#, Fortran 95 - Visual Studio
|
Verfasst: Fr 21.05.10 17:03
Hallo,
das wäre super - aber das gibts bei keinem heuristischen Algorithmus. (Sonst wäre diese ja fast überflüssig wenn die Anzahl der Iterationen bekannt ist).
Du kannst aber in der Literatur für Empfehlungen o.ä. suchen.
mfG Gü
_________________ Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!
|
|
Pr0g3r 
      
Beiträge: 44
Win XP
Turbo Pascal, Delphi 5&7, Ti-Basic
|
Verfasst: Fr 21.05.10 17:17
Ich hab mal geguckt, aber leider nichts gefunden
vielleicht 2^irgendwas? (ist es ja meistens  )
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Fr 21.05.10 17:39
Hi
Dabei lässt sich sicherlich - unter Annahme zufälliger Gegenstände - ein Erwartungswert angeben. Dieser kann aber durch die vermutlich relativ starke Streuung auch sehr nutzlos ausfallen.
Erfahrungsgemäß ist der Rechenaufwand für die nächsthöhere Anzahl von Iterationen dabei aber so viel höher, dass selbst die vorherige Berechnung aller kleinerer Iterationsstufen noch nicht zu inem merklichen Anstieg der Rechenzeit führt.
So auch beim Schach, wo die Anzahl der vorausberechneten Halbzüge zwar stufenweise erhöht wird, aber für jede weitere Stufe alle vorherigen Berechnungen komplett neu durchgeführt werden.
Ob das bei deinem Algo so ist, hängt vom Anstieg der Rechenzeit mit der Iterationsanzahl ab. Für Schach ist das proportional zum Verhältnis von Blättern zu Knoten, und es existieren in einem Baum sehr viel mehr Blätter als Knoten.
lg,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|