Forum: PC-Programmierung Optimierungsalgorithmus?


von cppbert (Gast)


Lesenswert?

Fiktives Szenario damit mir vielleicht jemand sagen kann wie solche 
Algorithmen genannt werden - für eine ausschweifende google-Suche

ich habe eine Datenquelle aus der ich per int32 id einen Text 
unterschiedlicher Länge bekommen kann

z.B.

zu 1 bekomme ich "hallo wie geht es dir"
zu 2 bekomme ich "du du"
zu 3 bekomme ich "tralala"
usw.

viele tausend ids sind vorhanden, zu jeder id ist vorher klar wie viele 
Bytes der Text im Ergebnis enthält

der Query-Block hat eine feste länge in den ich 20 ids stellen kann
(d.h. 20*sizeof(int32) = 80 bytes)

der Result-Block hat eine feste Länge die dem Query Block entspricht
und in dem die Texte serialisiert geliefert werden

der Query oder Result-Block darf durch die angebenen ids nicht zu gross 
werden, müssen also beide im 80 byte Bereich bleiben (es gibt keine 
Texte die größer sind als 80 Bytes)

die Anzahl an Query(aka Result)-Blöcken ist entscheident für die 
Performanz d.h. wenig Queries = hohe Geschwindigkeit, was mein Ziel wäre

jetzt möchte ich hunderte von ids möglichst schnell Abfragen:

einfache(langsamste) Lösung:

jede id einzeln Abfragen

bessere(bisschen schneller) Lösung:

die Query-Blöcke so lange mit ids auffüllen
bis der Query oder Result-Block voll ist, dann den nächsten Query 
erzeugen
bist die id Liste durch ist

optimale Lösung:

die ids werden so auf Query-Blöcke verteilt das eine möglichst kleine 
Menge an Queries ensteht (vergleichbar mit Schnittmuster platzsparend 
verteilen)

Wie nennt man solche Algorithmen, Suchbegriffe für google?

von Peter M. (r2d3)


Lesenswert?

Rucksack-Probleme, englisch "knapsack".

Beitrag #6222305 wurde vom Autor gelöscht.
von Helmut H. (helmuth)


Lesenswert?

https://de.wikipedia.org/wiki/Beh%C3%A4lterproblem
mit Approximationsalgorithmus First Fit Decreasing:
"
Sortiere die Objekte nach absteigendem Gewicht
Füge die Objekte der Reihe nach ein,
sodass jedes in den ersten Behälter gegeben wird, in dem noch genug 
Platz ist.
Falls in keinem der bereits geöffneten Behälter genügend Platz ist, 
öffne einen neuen.
"

von cppbert (Gast)


Lesenswert?

Rucksack und Transport Problem ist schon mal eine gute Richtung

Meine Texte sind dann die Güter die mit möglichst wenig Transportern 
geliefert werden sollen, oder?

von cppbert (Gast)


Lesenswert?

Sieht auch ein bisschen aus wie das Multiple Knapsack Problem, nur die 
Constraints sind anders

von cppbert (Gast)


Lesenswert?

Kleinere Beschreibung des Szenarios:

n Gewichte (1-80Kg) sollen auf so wenig Rucksäcke wie möglich verteilt 
werden

Einschränkung: Jeder Rucksack kann maximal 20 Gewichte aufnehmen und 
eine Maximallast von 80Kg tragen

von Peter M. (r2d3)


Lesenswert?

Da hilft der kleine Gauss:

1x 80 kg,

Dann 1+79, 2+78, 3+77, 4+76 ... und 40 solo.

von cppbert (Gast)


Lesenswert?

Peter M. schrieb:
> Da hilft der kleine Gauss:
>
> 1x 80 kg,
>
> Dann 1+79, 2+78, 3+77, 4+76 ... und 40 solo.

Kapier ich nicht:

z.B. habe ich diese Gewichte(kg): 5,80,34,2,2,7,8,9,40

Wuerde bei mir diese Rucksäcke ergeben

5+34+40
80
2+2+7+8+9

von Peter M. (r2d3)


Lesenswert?

Hallo cppbert,

cppbert schrieb:
> Peter M. schrieb:
>> Da hilft der kleine Gauss:
>>
>> 1x 80 kg,
>>
>> Dann 1+79, 2+78, 3+77, 4+76 ... und 40 solo.
>
> Kapier ich nicht:

Ich habe Deine Beschreibung nicht so verstanden, wie Du sie verstanden 
hast.
:)

>
> z.B. habe ich diese Gewichte(kg): 5,80,34,2,2,7,8,9,40
>
> Wuerde bei mir diese Rucksäcke ergeben
>
> 5+34+40
> 80
> 2+2+7+8+9

Du meinst in Wirklichkeit n ganzzahlige Zufallszahlen aus dem Intervall 
[1;80] (mit oder ohne zurücklegen?, das heißt ob sich Zufallszahlen 
wiederholen können).

Jetzt brauchst Du nur noch ein Kostengewichte, die Dir sagen, was ein 
Behälter kostet (z.B. ein Hin- und Rückflug nach Wuhan) und was ein 
Probiervorgang kostet. Dann siehst Du ja, wie groß die Kosten (und 
Ersparnisse!) werden, wenn es darum geht, Helmuts triviale Heuristik zu 
schlagen.

: Bearbeitet durch User
von cppbert (Gast)


Lesenswert?

> Ich habe Deine Beschreibung nicht so verstanden, wie Du sie verstanden
> hast.
> :)

Weil die Erklärung schlecht war? :(

> Du meinst in Wirklichkeit n ganzzahlige Zufallszahlen aus dem Intervall
> [1;80] (mit oder ohne zurücklegen?, das heißt ob sich Zufallszahlen
> wiederholen können).

Mit wiederholung von den Zufallszahlen: 5,6,5,7,7 ist also Ok

> Jetzt brauchst Du nur noch ein Kostengewichte, die Dir sagen, was ein
> Behälter kostet (z.B. ein Hin- und Rückflug nach Wuhan) und was ein
> Probiervorgang kostet. Dann siehst Du ja, wie groß die Kosten werden,
> wenn es darum geht, Helmuts triviale Heuristik zu schlagen.

Mehr Informationen gibt es in meinem Szenario nicht - es geht wirklich 
nur um die optimale Verteilung der Gewichte (aka Hanteln)

von Helmut H. (helmuth)


Lesenswert?

Peter M. schrieb:
> Helmuts triviale Heuristik

Das war ein Zitat aus dem Wikipedia-Artikel, sorry falls das nicht 
ersichtlich war. Noch ein Zitat: "Johnsons Approximationsalgorithmus 
First Fit Decreasing löst das Problem in polynomieller Zeit mit einer 
scharfen asymptotischen Gütegarantie von 11/9"

von Peter M. (r2d3)


Lesenswert?

Helmut H. schrieb:
> Peter M. schrieb:
>> Helmuts triviale Heuristik
>
> Das war ein Zitat aus dem Wikipedia-Artikel, sorry falls das nicht
> ersichtlich war.

Doch, das war ersichtlich, aber von mir faul und unpräzise abgekürzt.

von sid (Gast)


Lesenswert?

cppbert schrieb:
> Kapier ich nicht:
>
> z.B. habe ich diese Gewichte(kg): 5,80,34,2,2,7,8,9,40
>
> Wuerde bei mir diese Rucksäcke ergeben
>
> 5+34+40
> 80
> 2+2+7+8+9

kommt auf die Wertung an..

eventuell ist 2+2+34+40, 80 und 5+7+8+9
weil so kein Rucksack 5 Gewichte hat besser..

Warum ist das Wichtig?
Weil TO nach query strings fragt
und strings haben im concatenate häufig einen node count penalty von 
plus eins
(wir sagen auch gerne Leerzeichen dazu ;))
man kann also eben eventuell NICHT
16 5 kg Gewichte in einen 80kg Rucksack packen
da 15 von ihnen einen +1 Längenmodifikator haben (Leerzeichen)

der Algorithmus sollte (sofern Leerzeichen benötigt werden)
diese auch zählen.

cppbert schrieb:
> zu 1 bekomme ich "hallo wie geht es dir"
> zu 2 bekomme ich "du du"
> zu 3 bekomme ich "tralala"

es macht also einen Unterscheid ob man bei 1+2
"hallo wie geht es dirdu du" oder
"hallo wie geht es dir du du" als query braucht

(oder weil es vielleicht wahrscheinlicher ist.."|" ;))

'sid

von cppbert (Gast)


Lesenswert?

sid schrieb:
> Warum ist das Wichtig?
> Weil TO nach query strings fragt

ich hab das ganze auf Hantel-Gewichte und Rucksäcke reduziert - damit 
solche Details wirklich nicht relevant sind

Hantel-Gewicht = alle Daten (mit Leerzeichen) :)

von sid (Gast)


Lesenswert?

naja dasselbe glt aber für Hantelscheiben in Rücksäcken,
die sind ja nunmal unterschiedlich gross bei unterschiedlichem Gewicht,
und in den äusseren Abmessungen ist eine 10kg Scheibe kleiner als zwei 
5kg Scheiben (um's überzählige Mittelloch mindestens.. ein Leerzeichen 
quasi ;))

Aber gut, wenn Du keine Trennzeichen mit concatenieren musst,
dann klar.. alles gut .. weitermachen
falls doch, denk an deren anzahl und falls Du C-strings benutzt den 
string terminator ;)

Quasi als Merksatz:
"ich habe hier ganz schnell achtzig byte vollgeschrieben und dabei 
zweiundneunzig verbraucht\0"

ich weiss.. man verbraucht keine aber ich musste ja auf 80 und 
zweiundneunzig kommen, da kann man schonmal freier formulieren müssen ;)

Mahlzeit

'sid

von cppbert (Gast)


Lesenswert?

sid schrieb:
> naja dasselbe glt aber für Hantelscheiben in Rücksäcken,
> die sind ja nunmal unterschiedlich gross bei unterschiedlichem Gewicht,

Das Volumen(Größe) kann man in meinem Beispiel ignorieren - vergessen 
hin zu schreiben :|

Ich hab ein Beispiel gefunden das passt

https://stackoverflow.com/questions/48866506/binpacking-multiple-constraints-weightvolume

Ich brauche eine Lösung ohne Solver aber als Testgrundlage um dann die 
Qualität meiner eigenen Implementierung zu beurteilen ist das denke ich 
schon mal sehr wertvoll

von Helmut H. (helmuth)


Lesenswert?

cppbert schrieb:
> Ich brauche eine Lösung ... als Testgrundlage
Hänge doch mal deine Testdaten als Textdatei (nur die Stringlängen 
inklusive Terminator) an, vielleicht finden wir eine gute Lösung...
Mit deinen Daten oben
[40, 34, 5]
[80]
[9, 8, 7, 2, 2]
Anzahl  3  Free 53

von sid (Gast)


Lesenswert?

hm A* (A star) könnte klappen.. wenn man die value und penalties 
sinnvoll setzt

zB indem Du alle text-bausteine der Datenquelle
in Knoten ihrer Stringlänge setzt,
dem Knoten dann die Gesamtzahl als Wert gibst.
die Stringlänge ist deine "Distanz zum Ziel"

verlässt man einen Knoten, wird der Wert um eins verringert (man hat ja 
einen string benutzt)

man kann sich sogar den Pfad (die strings) ausspucken lassen.
Hat nun ein Pfadsucher sein Ziel erreicht
(also 80 byte länge ud möglichst viele Punkte)
sind seine Worte schon aus den knoten gelöscht und man speichert den 
Pfad
der nächste Pfadsucher hat dann etwas weniger Auswahl...
und irgendwann hat man nurnoch wenige Knoten mit Inhalt, leere knoten 
erzeugen keine Stringverlängerung und haben den Wert null.
der letzte pfadsucher hat dann ggf nur 8 oder neun punkte generiert weil 
nurnoch ein oder zwei strings übrig blieben...
aber viel effizienter wirst Du es kaum hinbekommen

'sid

von cppbert (Gast)


Lesenswert?

Helmut H. schrieb:
> cppbert schrieb:
>> Ich brauche eine Lösung ... als Testgrundlage
> Hänge doch mal deine Testdaten als Textdatei (nur die Stringlängen
> inklusive Terminator) an, vielleicht finden wir eine gute Lösung...

wie ich schon geschrieben habe, es ist ein...

> Fiktives Szenario damit mir vielleicht jemand sagen kann wie solche
> Algorithmen genannt werden

es gibt keine Terminatoren :)

und auch die Hanteln und Rucksäcke sind nur ein Beispiel - die Zahlen 
damit man was handfesteres hat

Ich denke das Hantel/Rucksack-Beispiel ist einfacher:

-Es gibt n Hanteln (Mit Zufallsgewicht zwischen 1-80Kg)
-Ein Rucksack kann maximal 80Kg aufnehmen
-Ein Rucksack kann maximal 20 Hanteln aufnehmen (Volumen/Größe 
unrelevant)
-Hantel-Gewichte können mehrfach in einem Rucksack vorkommen - also z.B. 
3 x 2Kg

Ziel: für eine Menge aus Hanteln z.B. 200 Stück herausbekommen wie man 
die verteilen muss damit die geringste Anzahl an Rucksäcken gebraucht 
wird

von Egon D. (Gast)


Lesenswert?

cppbert schrieb:

> Ziel: für eine Menge aus Hanteln z.B. 200 Stück
> herausbekommen wie man die verteilen muss damit
> die geringste Anzahl an Rucksäcken gebraucht
> wird

???

Was an "bin packing problem" ist Dir unklar?

von cppbert (Gast)


Lesenswert?

Egon D. schrieb:
> cppbert schrieb:
>
>> Ziel: für eine Menge aus Hanteln z.B. 200 Stück
>> herausbekommen wie man die verteilen muss damit
>> die geringste Anzahl an Rucksäcken gebraucht
>> wird
>
> ???
>
> Was an "bin packing problem" ist Dir unklar?

Das würde ich ausprobieren - eben mit Erweiterung auf die 20 Hanteln 
maximal

von Egon D. (Gast)


Lesenswert?

cppbert schrieb:

>> Was an "bin packing problem" ist Dir unklar?
>
> Das würde ich ausprobieren - eben mit Erweiterung
> auf die 20 Hanteln maximal

Ach so... mea culpa.

Diese Beschränkung ist im originalen "bin packing
problem" nicht enthalten; Du hast Recht.

Man müsste sich mal überlegen, ob diese Beschränkung
überhaupt wesentlichen Einfluss hat. Wenn das Gros
Deiner nachrichten länger als 4 Zeichen ist (was ich
annehme), wird die Beschränkung der Anzahl der
Nachrichten je Bin selten zum Tragen kommen. Wenn es
keine Nachrichten gibt, die kürzer als 4 Zeichen sind,
sogar überhaupt nie.

von cppbert (Gast)


Angehängte Dateien:

Lesenswert?

von: 
https://www.tutorialspoint.com/bin-packing-problem-minimize-number-of-used-bins-in-cplusplus

die Implementierung genommen und die volumen-einschränkung per bin + 
liste der Gewichte die in bin sind eingebaut

sieht mal nicht so schlecht aus

von cppbert (Gast)


Lesenswert?

cppbert schrieb:
> von:
> 
https://www.tutorialspoint.com/bin-packing-problem-minimize-number-of-used-bins-in-cplusplus
>
> die Implementierung genommen und die volumen-einschränkung per bin +
> liste der Gewichte die in bin sind eingebaut
>
> sieht mal nicht so schlecht aus

ist nicht die schönste Implementierung aber ein guter Start

Beispiel-Ausgabe:
1
weight1:
2
42 39 80 74 45 47 31 59 3 17
3
bin_rem[0]: 0, adds: 1
4
  weight[0]: 80
5
bin_rem[1]: 3, adds: 2
6
  weight[1]: 74
7
  weight[9]: 3
8
bin_rem[2]: 4, adds: 2
9
  weight[2]: 59
10
  weight[8]: 17
11
bin_rem[3]: 2, adds: 2
12
  weight[3]: 47
13
  weight[7]: 31
14
bin_rem[4]: 35, adds: 1
15
  weight[4]: 45
16
bin_rem[5]: 38, adds: 1
17
  weight[5]: 42
18
bin_rem[6]: 41, adds: 1
19
  weight[6]: 39
20
Number of bins required in First Fit Decreasing : 7

von cppbert (Gast)


Lesenswert?

Jetzt würde ich noch das Solver 
(https://stackoverflow.com/questions/48866506/binpacking-multiple-constraints-weightvolume) 
basierte Beispiel in ein paar hundert Randomszenarien dagegen kämpfen 
lassen, mal schauen was da so raus kommt

von cppbert (Gast)


Angehängte Dateien:

Lesenswert?

noch ein Beispiel wo die Packdichte nicht ganz perfekt ist:

Beispiel von hier: http://www.youtube.com/watch?v=7QBwgI7h-zw&t=9m29s

zum Online-Spielen: cpp.sh/57zkx

Ausgabe:
1
weight1:
2
200 140 120 120 110 100 100 90 80 75 75 70 65 60 60 50 40 25
3
bin_rem[0]: 0 (added: 3)
4
  weight1
5
   [0]: 200
6
   [1]: 140
7
   [13]: 60
8
  complete: 400
9
bin_rem[1]: 0 (added: 4)
10
  weight1
11
   [2]: 120
12
   [3]: 120
13
   [4]: 110
14
   [15]: 50
15
  complete: 400
16
bin_rem[2]: 5 (added: 5)
17
  weight1
18
   [5]: 100
19
   [6]: 100
20
   [7]: 90
21
   [8]: 80
22
   [17]: 25
23
  complete: 395
24
bin_rem[3]: 15 (added: 6)
25
  weight1
26
   [9]: 75
27
   [10]: 75
28
   [11]: 70
29
   [12]: 65
30
   [14]: 60
31
   [16]: 40
32
  complete: 385
33
Number of bins required in First Fit Decreasing : 4

(aus dem Video)
um eine "optimiale" Packdichte zu bekommen könnte man noch

bin[2] 100 in bin[3] verschieben
und von bin[3] 65+40 in bin[2] schieben

damit wäre dann auch der bin[2] auf 400
und bin[3] wäre dann auf 380

vielleicht nocht mit "Best Fit Decreasing" optimierbar aber vielleicht 
geht es auch nicht besser und ist eh sehr stark von den Gewichten 
abhängig wie gut man verdichten kann

von cppbert (Gast)


Lesenswert?

cppbert schrieb:
> vielleicht nocht mit "Best Fit Decreasing" optimierbar

Best Fit ändert nichts an der Packdichte - gleiches Ergebnis

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.