Container-Pack-Algorithmus

Status
Nicht offen für weitere Antworten.

Evolver

Bekanntes Mitglied
Ich benötige für mein Programm einen Algorithmus, um Rechtecke (Pakete) in einem größeren Rechteck (Container) anzuordnen. Ich hatte auch einen Algorithmus gefunden, der ganz nett funktioniert hat und den ich deswegen in mein Programm eingebaut habe. Leider ist er jetzt in der Praxis gähnend langsam. Die problematische Stelle habe ich schnell gefunden, und nun suche ich nach einer Lösungsmöglichkeit.

Es gibt eine Container-Klasse, die zum Anordnen der Pakete verwendet wird und zum Prüfen, ob eine Anordnung zulässig ist. Hauptbestandteil ist ein 2dimensionales boolean-Feld, das den Container repräsentiert und für jedes "Pixel" angibt, ob es belegt ist oder nicht. Ein Paket im Container wird dargestellt, in dem die Postionen im boolean-Feld, die dem Paketrand entsprechen, auf true gesetzt werden.
Für den Algorithmus gibt es zwei Funtionen, die ein Paket soweit wie möglich nach links bzw. unten schieben, also solange, bis der Containerrand erreicht ist oder ein anderes Paket im Weg ist. Und diese beiden Funktionen sind der Performance-Killer, denke ich.

Code:
class Container
{
	private boolean mStack[][];			
	// ...
	
	public Container(int pStackWidth, int pStackHeight)
	{
		// ...
		mStack = new boolean[pStackWidth][pStackHeight];
		for(int i=0; i<pStackWidth; ++i)
			for(int j=0; j<pStackHeight; ++j)
				mStack[i][j] = false;
		// ...
	}

	// ...
	
	public void moveLeft(Chromosome pChr) 
	{
		if(pChr.getTopY()>=mStackHeight) return;
		boolean tMoveLeft = true;
		while(tMoveLeft && (pChr.mPosition.x>0)) {
			for(int j=pChr.mPosition.y; j<=pChr.getTopY(); ++j)
				if(mStack[pChr.mPosition.x-1][j]) {		// Schieben nach links nicht mehr möglich ...
					tMoveLeft = false;				// ... (dort liegt bereits ein anderes Paket)
					break;
				}
			if(tMoveLeft)	// Verschiebe um eine Position nach links
				pChr.setPosition(pChr.mPosition.x - 1, pChr.mPosition.y);
		}
	}
	
	
	public void moveDown(Chromosome pChr)
	{
		if(pChr.getRightX()>=mStackWidth) return;
		boolean tMoveDown = true;
		while(tMoveDown && (pChr.mPosition.y>0)) {
			for(int i=pChr.mPosition.x; i<=pChr.getRightX(); ++i)
				if(mStack[i][pChr.mPosition.y-1]) {	// Schieben nach unten nicht mehr möglich
					tMoveDown = false; 
					break;
				}
			if(tMoveDown) // Verschiebe um eine Position nach unten; Links-Überprüfung aktivieren;
				pChr.setPosition(pChr.mPosition.x, pChr.mPosition.y - 1);
		}
	}
}

Wie könnte ich nun das Verschieben beschleunigen? Eine erste Idee war, nicht jedes Pixel der jeweiligen Kante zu Prüfen, da die Pakete eine gewissen Mindestgröße haben. Aber welche weitern Ansätze gibt es?
 

Evolver

Bekanntes Mitglied
Hier ist noch der Link zu einer Beispielimplementierung, nach der ich meine umgesetzt habe.
Genetischer Algorithmus für Packproblem
Unten auf der Seite finden sich die Quellcodes.

Mein erster Ansatz, beim verschieben einige Schritte zu überspringen, hat leider nicht wirklich viel gebracht. Aber im Moment bin ich dennoch der Meinung, dass die Container-Klasse der Flaschenhals ist.
 

Evolver

Bekanntes Mitglied
Also heute Mittag kam mir die Idee, den Container komplett umzubauen: Einfach eine Liste von Paketen (Rechtecken) machen und die Funktionen dann alle mittels einfacher Kollisionserkennung. Für meine auftretenden Verhältnisse von Paetgrößen und Paketanzahl dürfte das wesentlich schneller sein. Aber falls jemand Lust hat, kann er sich ja mal die Klasse Genotyp und den Algorithmus selbst anschauen, da kann man vielleicht auch noch einiges rausholen. Aber wie, das weiß ich eben nicht.
 

Evolver

Bekanntes Mitglied
Auch wenn ich in diesem Thread absoluter Alleinunterhalter bin, bringe ich trotzdem noch den Abschluss: Also der Umbau mit der Liste der Pakete und der einfachen Kollisionserkennung für Rechtecke hat den gewünschten Effekt gebracht und ich bin mit der Geschwindigkeit jetzt zufrieden.
 

Marco13

Top Contributor
Zumindest einen Mitleser hast du :wink:
So ein Problem (das doch etwas komplizierter ist, als die vielen RTFM-Fragen, die hier gestellt werden) ist zwar ineteressant, aber die Zeit, sich dort so weit einzuarbeiten, dass man die "kritische Stelle" findet, und die dann auch noch verbessern kann (so dass es nachher noch genauso funktioniert wie vorher, und/oder(!) das macht, was es machen soll, findet eben nicht jeder :(
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
MarekLanger Filepath in Log4j2 in Docker Container Allgemeine Java-Themen 12
B Thread.sleep() in EJB Container wie lösen? Allgemeine Java-Themen 11
J Gebautes Jar per Maven in einen Docker Container kopieren Allgemeine Java-Themen 0
HarleyDavidson Best Practice Suche "Container" für Modulapplikationen Allgemeine Java-Themen 0
D Eigene/r Collection/Container Allgemeine Java-Themen 3
L Collections Schnellster Container für 4Byte vergleiche Allgemeine Java-Themen 13
S Suche Dependency Injection Container Allgemeine Java-Themen 6
A Container für tochterklassen? Allgemeine Java-Themen 4
J J2EE Server für EJB Container Allgemeine Java-Themen 8
D Frames und Container Allgemeine Java-Themen 16
G Button-Array überschreiben und dem Container zufügen? Allgemeine Java-Themen 2
T S: Passenden "Container" for ByteBUffer Pool Allgemeine Java-Themen 6
S Suche schnellen Container Typ Queue Allgemeine Java-Themen 7
P adding a window to a container Allgemeine Java-Themen 3
D asynchrone "Container" Allgemeine Java-Themen 5
M Container aktualisieren. Nur wie? Allgemeine Java-Themen 3
J pack() lässt JFrame grau Allgemeine Java-Themen 3
B Algorithmus für Arbeit mit fehlenden Listenelementen? Allgemeine Java-Themen 1
schegga_B AES-Algorithmus in javax.crypto Allgemeine Java-Themen 3
M Laufzeit des Prim Algorithmus Allgemeine Java-Themen 3
O Newton Algorithmus Java Allgemeine Java-Themen 1
CptK Backpropagation Algorithmus Allgemeine Java-Themen 6
N Google Authenticator Algorithmus (SHA1) Allgemeine Java-Themen 1
gotzi242 Schatzsuche mithilfe eines O(log n) Algorithmus Allgemeine Java-Themen 2
Zrebna Quicksort-Algorithmus - zufälliges Pivot wählen Allgemeine Java-Themen 6
L Klassen Algorithmus für das folgende Problem entwickeln? Allgemeine Java-Themen 30
B Algorithmus Warteschlange Ringpuffer wirklich fehlerfrei Allgemeine Java-Themen 8
M Probleme mit Negamax-Algorithmus Allgemeine Java-Themen 29
F Q - Learning Algorithmus Bug Allgemeine Java-Themen 4
M Salesman Problem - Bruteforce Algorithmus Allgemeine Java-Themen 23
M Minmax Algorithmus Verständnisproblem Allgemeine Java-Themen 2
H Rundreise frage (Algorithmus) Allgemeine Java-Themen 18
F KMP-Algorithmus Allgemeine Java-Themen 9
S Algorithmus welcher True-Werte in einem Array findet und auswertet. Allgemeine Java-Themen 5
U Methoden Algorithmus MergeSort String [ ] array sortieren programmieren Allgemeine Java-Themen 17
P MinMax Algorithmus Allgemeine Java-Themen 0
J Abhängigkeit zwischen Rechenzeit und Speicherbedarf in einen Algorithmus Allgemeine Java-Themen 7
K Djikstra-Algorithmus Allgemeine Java-Themen 1
T Minimax/Alphabeta Algorithmus hängt sich auf (?) Allgemeine Java-Themen 2
M Algorithmus zum Zahlen einteilen Allgemeine Java-Themen 8
O Best Practice Hilfe bei Algorithmus gesucht Allgemeine Java-Themen 10
S Algorithmus um Objekte auf einer Flaeche mit gleichem Abstand anzuordnen..? Allgemeine Java-Themen 20
S Rucksackproblem und genetischer Algorithmus Allgemeine Java-Themen 9
L Abbruch des Algorithmus Allgemeine Java-Themen 8
D Input/Output Ausgleichen chemischer Reaktionsgleichungen mit dem Gauß-Algorithmus Allgemeine Java-Themen 2
Messoras A*-Algorithmus integrieren Allgemeine Java-Themen 3
S Buchscan 3D Dewarp Algorithmus - Ansätze Allgemeine Java-Themen 1
B Verteilungs-/Vergabe-Algorithmus mit abhängigen Score-Werten Allgemeine Java-Themen 3
Androbin "Shunting Yard"-Algorithmus Allgemeine Java-Themen 6
B Algorithmus - Project Euler Problem 18 Allgemeine Java-Themen 2
N Algorithmus zum bewerten von mathematischen Funktionen Allgemeine Java-Themen 11
O Algorithmus Optimierung Allgemeine Java-Themen 3
Joew0815 Algorithmus - Zahlenfolge in 4 ähnliche Teile aufteilen Allgemeine Java-Themen 0
O Tag Cloud Algorithmus Idee gesucht Allgemeine Java-Themen 2
A Implementierung eines Algorithmus (Farthest Insertion zur Lösung des TSP) in O(n²) Allgemeine Java-Themen 2
C Eclipse Probleme bei selbst erstelltem Algorithmus Allgemeine Java-Themen 2
H Graph-Algorithmus gesucht Allgemeine Java-Themen 21
N Algorithmus durch Workflow Allgemeine Java-Themen 7
M tree-based diff Algorithmus (Code-Vergleiche) Allgemeine Java-Themen 3
S Uhrzeit Algorithmus sale Allgemeine Java-Themen 11
N A*-Algorithmus Allgemeine Java-Themen 5
A Suche Algorithmus zum Erstellen eines planaren Graphen Allgemeine Java-Themen 5
F Methoden Algorithmus zur Gegnerfindung (Turnier) Allgemeine Java-Themen 9
T Algorithmus Graph Allgemeine Java-Themen 10
J Algorithmus gesucht (Stringtransformation) Allgemeine Java-Themen 4
B Algorithmus Krankenhausbelegung Allgemeine Java-Themen 17
S Algorithmus von Dijkstra Allgemeine Java-Themen 2
alex_fairytail OOP Banknoten Algorithmus Teil 2 Allgemeine Java-Themen 13
2 ArrayList aktualisieren Algorithmus Allgemeine Java-Themen 11
alex_fairytail Methoden Banknoten Algorithmus Allgemeine Java-Themen 10
R Codehinweise: Algorithmus Größenvergleich von n Zahlen Allgemeine Java-Themen 5
SuperSeppel13 WTF?! Algorithmus-Geschwindigkeitstest Allgemeine Java-Themen 2
L Algorithmus für kürzesten Weg mit Wegpunkten Allgemeine Java-Themen 21
C Algorithmus Problem in Minesweeper Allgemeine Java-Themen 5
S Algorithmus um Labyrinth zu erzeugen Allgemeine Java-Themen 6
V Problem mit A* Pathfinder-Algorithmus Allgemeine Java-Themen 2
S Algorithmus um nächst folgende Primzahl zu berechnen Allgemeine Java-Themen 7
S Algorithmus Problem. Rechtecke effizient auf Spielfeld anordnen. Allgemeine Java-Themen 7
C Algorithmus-Hilfe Allgemeine Java-Themen 20
J Algorithmus Längenkombinationen? Allgemeine Java-Themen 7
M Kombinationen über rekursiven Algorithmus berechnen? Allgemeine Java-Themen 10
L Algorithmus für Poker-Hände Allgemeine Java-Themen 7
chik 2 return werte für Greedy-Algorithmus (gelöst) Allgemeine Java-Themen 3
D Abstruse Probleme mit eigenem replace Algorithmus Allgemeine Java-Themen 11
P RC4 Algorithmus Allgemeine Java-Themen 3
D RSA Verfahren - Erweiterter Euklidischer Algorithmus Allgemeine Java-Themen 4
C IBAN und Bic Validieren (Algorithmus) Allgemeine Java-Themen 10
P Problem mit A*-Algorithmus Allgemeine Java-Themen 12
M Wörter Algorithmus Allgemeine Java-Themen 7
M Algorithmus für automatische Zeilenumbrüche Allgemeine Java-Themen 12
K Postleitzahlen Algorithmus Allgemeine Java-Themen 12
G Problem mit Algorithmus Allgemeine Java-Themen 3
T Hilfe bei einem Algorithmus Allgemeine Java-Themen 2
S Stemming-Algorithmus gesucht (z.B. Porter) Allgemeine Java-Themen 2
RoliMG präfix zu infix algorithmus Allgemeine Java-Themen 6
Z A*-Algorithmus - Probleme mit offener/geschlossener Liste Allgemeine Java-Themen 7
S Javaimplementierung des MD5 Algorithmus Allgemeine Java-Themen 2
G k nearest neighbor algorithmus Allgemeine Java-Themen 7
C HASH Algorithmus 2 Strings ergeben das Selbe. Allgemeine Java-Themen 2
P Page Rank Algorithmus implementieren Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben