A* funktioniert, aber zu langsam

Opi3

Aktives Mitglied
Hallo,
für ein Spiel brauche ich irgendein Algo fürs Pathfinding.
Ich habe mich führ A* entschieden und ihn umgesetzt.:rtfm:

Leider, lässt er, in Hinsicht auf die Geschwindigkeit stark zu wünschen übrig:
Java:
	public List<Point> search() {

		if (start == null || ziel == null) {
			return null;
		}

		clearNodes();
		ArrayList<Knoten> openList = new ArrayList<Knoten>();

		openList.add(start);
		start.G = 1;
		start.setH(ziel);
		start.setF();
		start.last = null;
		Boolean zielGefunden = false;
		while (!zielGefunden) {
			if (openList.isEmpty()) {
				return null;
			}
			Collections.sort(openList);
			Knoten base = openList.get(0);
			openList.remove(base);
			base.flag = Knoten.IS_CLOSED_LIST;
			if (checkKnoten(base.x - 1, base.y, base, openList)) {
				zielGefunden = true;
			}
			if (checkKnoten(base.x + 1, base.y, base, openList)) {
				zielGefunden = true;
			}
			if (checkKnoten(base.x, base.y - 1, base, openList)) {
				zielGefunden = true;
			}
			if (checkKnoten(base.x, base.y + 1, base, openList)) {
				zielGefunden = true;
			}

		}
		ArrayList<Point> path = new ArrayList<Point>();
		Knoten base = ziel;
		path.add(ziel.point);
		while (true) {
			base = base.last;
			if (base == null) {
				break;
			}
			path.add(base.point);
		}
		return path;
	}

	private boolean checkKnoten(int _x, int _y, Knoten base,
			ArrayList<Knoten> openList) {
		if ((_x >= 0 && _x < x) && (_y >= 0 && _y < y)) {
			Knoten k = knoten[_x][_y];

			int g = base.G + 1;
			int h = k.getH(ziel);

			if (k.flag != Knoten.IS_CLOSED_LIST) {
				k.G = g;
				k.H = h;
				k.setF();
				k.last = base;
				openList.add(k);
			} else if (g < k.G) {
				k.G = g;
				k.H = h;
				k.setF();
				k.last = base;
				openList.add(k);
				k.flag = Knoten.IS_OPEN_LIST;
			}
			return k == ziel;
		}
		return false;

	}

	private void clearNodes() {
		for (int _x = 0; _x < x; _x++) {
			for (int _y = 0; _y < y; _y++) {
				Knoten k = knoten[_x][_y];
				k.G = -1;
				k.H = -1;
				k.F = -1;
				k.flag = Knoten.NO_List;
				k.last = null;
			}
		}

Kann mir eventuell jemand Tipps geben,
wie ich ihn Optimieren kann?

Opi3
 

Opi3

Aktives Mitglied
~50*150

(Und ich muss mehrere Minuten warten!!!)
(Der Graph ist doch die 'Map' oder bin ich auf dem falschen Dampfer?)

Opi3
 

Fu3L

Top Contributor
Java:
   Boolean zielGefunden = false;

Hier im Forum fällts leicht auf: Musst aufpassen mit der Groß- und Kleinschreibung.. Hab hier schon Beispiele gesehen, wo global deklarierte Booleans zu "unerklärbaren" NullPointerExceptions geführt haben. (boolean würde vom Compiler ja automatisch mit false gefüllt)

Hat zwar herzlich wenig mit der Geschwindigkeit des Algorithmus zu tun, aber der ist bei größeren Graphen schnell überfordert (s. Schalentiers Post)

Edit: ich war auch schonmal schneller^^ :oops:
 
Zuletzt bearbeitet:
B

Beni

Gast
Versuch mal eine PriorityQueue zu verwenden, statt für jeden Knoten die gesammten "openList" neu zu sortieren.
 

schalentier

Gesperrter Benutzer
Ja, mit Graph mein ich die Groesse der Map.

50*150 = 7500, was noch nich besonders gross ist. Mir ist zunaechst mal das Collection.sort() aufgefallen, das is in jedem Falle unnoetig und moeglicherweise die Ursache fuer die schlechte Performance. Wobei bei einem so kleinen Graph das eigentlich kaum eine Rolle spielen sollte... aber genau wirst du das nur mit einem Profiler (z.B. YourKit, da gibts auch ne zeitlich beschraenkte Demo) herausbekommen.

Das Sortieren ist unnoetig, weil du immer nur das kleinste Element brauchst. Besser ist ein Heap, denn der ist immer sortiert (weil neue Elemente gleich korrekt einsortiert werden). Eventuell ist ein TreeSet, anstatt der ArrayList schon ausreichend (fuer die openList; da kannste dir auch das Collection.sort() sparen).

Ansonsten nimm den Profiler und finde die teuren Operationen.

edit: rechnen muesste man koennen...
 
Zuletzt bearbeitet:

Opi3

Aktives Mitglied
Wahnsinn, früher hat's ~40 Sekunden gedauert in einer 50*50 'Map',
jetzt dauerst's in einer 500*500 ~632.0 Ms.
Das nennt sich optimieren!!!:toll::applaus:

Vielen dank.
Wenn noch jemandem etwas auffährt...





Java:
	public List<Point> search() {
		if (start == null || ziel == null) {
			return null;
		}

		clearNodes();
		PriorityQueue<Knoten> openList = new PriorityQueue<Knoten>();

		openList.add(start);
		start.G = 1;
		start.setH(ziel);
		start.setF();
		start.last = null;
		Boolean zielGefunden = false;
		while (!zielGefunden) {
			if (openList.isEmpty()) {
				return null;
			}
			Knoten base = openList.element();
			openList.remove(base);
			base.flag = Knoten.IS_CLOSED_LIST;
			if (checkKnoten(base.x - 1, base.y, base, openList)) {
				zielGefunden = true;
			}
			if (checkKnoten(base.x + 1, base.y, base, openList)) {
				zielGefunden = true;
			}
			if (checkKnoten(base.x, base.y - 1, base, openList)) {
				zielGefunden = true;
			}
			if (checkKnoten(base.x, base.y + 1, base, openList)) {
				zielGefunden = true;
			}

		}
		ArrayList<Point> path = new ArrayList<Point>();
		Knoten base = ziel;
		path.add(ziel.point);
		while (true) {
			base = base.last;
			if (base == null) {
				break;
			}
			path.add(base.point);
		}
		
		return path;
	}
 
B

Beni

Gast
Mir fällt nur auf, dass man das hier...
Java:
            Knoten base = openList.element();
            openList.remove(base);
... auch so schreiben könnte:
Java:
Knoten base = openList.poll();
Ich bezweifle aber, dass das noch gross was ändert.
 

Marco13

Top Contributor
Hmm... aufpassen: Wenn mich nicht alles täuscht, muss da ja irgendwo die Entfernungvon Konten aktualisiert werden, die schon in der Queue sind. Diese Knoten werden durch eine Änderung dann NICHT an eine neue Position in der Queue verschoben. Wenn sich eine Eigenschaft des Knotens ändert, die für seine Position in der Queue relevant ist, muss man (in diesem Fall) den Knoten aus der Queue entfernen und nach der Änderung neu einfügen. (Eine Möglichkeit, die Queue, nur ein "update" machen zu lassen, gibt es AFAIK nicht)
 

schalentier

Gesperrter Benutzer
Hmm... aufpassen: Wenn mich nicht alles täuscht, muss da ja irgendwo die Entfernungvon Konten aktualisiert werden, die schon in der Queue sind.

Richtig, das hab ich voellig vergessen. Ich hab mal meine uralte BinaryHeap Implementierung angehangen, vielleicht hilft dir das was. Die kann auch einen geaenderten Eintrag im Heap neu sortieren (update). Bei Interesse kann ich auch den AStar Algo posten - aber vorsicht, der Code is gruselig :-D
 

Opi3

Aktives Mitglied
@Marco13
Gut, das hat den Bug gelöst, der z.b. entsteht wenn man das Ziel auf (0/0) und den Start auf(49/49)(ganz unten rechts im eck) setzt. (<- den habe ich gestern noch gute 3 Stunden gesucht. (Dann ist meine 'Liebe Frau Mama' ins zimmer gekommen, war ganz fassungslos, dass ich noch nicht schlafe, hat mir das Netbook weggenommen...))


Anleitung: Rechtsklick auf Kasten, Art auswählen.
(Hier noch mit Bug)

Opi3,

Edit: @schalentier tut mir Leid, dich habe ich völlig überlesen.
Ich werde mir die klassen mal angucken. vielen Dank
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Kollision funktioniert unten aber nicht oben Spiele- und Multimedia-Programmierung 4
P Pokemon Spiel Funktioniert nicht ? Spiele- und Multimedia-Programmierung 3
D MIDIdevice open funktioniert nicht Spiele- und Multimedia-Programmierung 1
A Kollision funktioniert nicht richtig bei zu schneller Geschwindigkeit des Spielers Spiele- und Multimedia-Programmierung 0
P Teamspeak interface mit JFrame funktioniert nicht Spiele- und Multimedia-Programmierung 3
N Animation funktioniert icht wie sie soll Spiele- und Multimedia-Programmierung 10
D Java Bild bewegen funktioniert nicht Spiele- und Multimedia-Programmierung 8
Damtonix Gameloop funktioniert nicht! Spiele- und Multimedia-Programmierung 6
temi libGDX Box2d ApplyTorque() funktioniert nicht Spiele- und Multimedia-Programmierung 1
M KeyListener funktioniert nicht während Timer läuft Spiele- und Multimedia-Programmierung 26
S KeyEvent funktioniert nicht, wenn Buttons dem Frame hinzugefügt werden Spiele- und Multimedia-Programmierung 7
C Export als .jar funktioniert nicht richtig (JAVA 3D) Spiele- und Multimedia-Programmierung 5
A Minecraft Minecraft, Programm funktioniert nur in Eclipse richtig Spiele- und Multimedia-Programmierung 24
F LWJGL: Licht und GL_LINES funktioniert nicht Spiele- und Multimedia-Programmierung 6
J KeyMapping funktioniert nicht Spiele- und Multimedia-Programmierung 5
J Sound einbinden funktioniert nicht Spiele- und Multimedia-Programmierung 13
D Slick Lib - Bilder einlesen funktioniert nicht Spiele- und Multimedia-Programmierung 2
M Mathetrainer - Reset Button funktioniert nicht! Spiele- und Multimedia-Programmierung 8
K Wie funktioniert hier ein Score ? Spiele- und Multimedia-Programmierung 4
D Highscoreliste eines Applets funktioniert online nicht Spiele- und Multimedia-Programmierung 4
StrikeTom KeyListener Funktioniert nicht Spiele- und Multimedia-Programmierung 3
aze Java 3D 1.5.2 auf Mac(Snow Leopard) funktioniert nicht mit Java SE 1.6 Spiele- und Multimedia-Programmierung 3
K "Animation" funktioniert nur bedingt. Spiele- und Multimedia-Programmierung 8
G Undo/Redo funktioniert nicht richtig Spiele- und Multimedia-Programmierung 2
Kidao Warum funktioniert hier keine Tastaturabfrage? Spiele- und Multimedia-Programmierung 6
S Sudoku Solver funktioniert beim 2. Aufruf nicht mehr Spiele- und Multimedia-Programmierung 11
R Kollisionserkennung funktioniert nicht Spiele- und Multimedia-Programmierung 3
R KeyListern funktioniert nicht. :S ? Spiele- und Multimedia-Programmierung 7
D Beispielprogram funktioniert nicht Spiele- und Multimedia-Programmierung 8
M Sonnensystem - Eigenrotation der Planeten funktioniert nicht Spiele- und Multimedia-Programmierung 4
M Wie funktioniert der RotPosPathInterpolator? Spiele- und Multimedia-Programmierung 5
B Programmieren wie der Befehl /ban in Minecraft geblockt wird aber nicht /ban mit einem Argument Spiele- und Multimedia-Programmierung 1
C 3d Engine : Fragment Shader , aber wie? Spiele- und Multimedia-Programmierung 17
C Eine eigene 3d Engine : Shader - aber wie ? Spiele- und Multimedia-Programmierung 2
F vlcj läuft nicht exportiert, aber in Eclipse Spiele- und Multimedia-Programmierung 2
S Draw Package - mehere Fenster will aber nur eins Spiele- und Multimedia-Programmierung 1
X LWJGL - Anklick baren Button erstellen aber wie? Spiele- und Multimedia-Programmierung 6
V Methoden werden zwar ausgeführt führen aber nicht zum Ergebnis Spiele- und Multimedia-Programmierung 5
T LWJGL VBO's funktionieren nicht, geben aber auch keinen Fehler Spiele- und Multimedia-Programmierung 0
G Sound-Sampling: Sinuston; kein Fehler, aber auch kein Ton :-( Spiele- und Multimedia-Programmierung 3
S Frage: NullPointer, aber warum? Spiele- und Multimedia-Programmierung 8
D VOte programm aber wie ?? Spiele- und Multimedia-Programmierung 8
F 2D Spiel mit verschiedenen Auflösungen aber gleichem Bildausschnitt? Spiele- und Multimedia-Programmierung 27
B Applet startet, aber führt den Thread nicht aus Spiele- und Multimedia-Programmierung 7
Developer_X Z-Buffering, ok, aber was ist mit X-Buffering und Y-Buffering? Spiele- und Multimedia-Programmierung 46
T Bekanntes Heli Spiel -> Aber Probleme damit Spiele- und Multimedia-Programmierung 30
T FMJ installieren - aber wie? Spiele- und Multimedia-Programmierung 3
T vier gewinnt programmieren - aber wie Spiele- und Multimedia-Programmierung 19
L Frame wird geöffnet es wird aber nix angezeigt Spiele- und Multimedia-Programmierung 2
D Spiele Wuerfel 3D aber wie Spiele- und Multimedia-Programmierung 6
P NPC zufällig laufen lassen, aber wie? Spiele- und Multimedia-Programmierung 2
M Tilemap, aber wie? (Ein Konzept) Spiele- und Multimedia-Programmierung 4
E Bounding Box Collision/intersection aber wie? Spiele- und Multimedia-Programmierung 10
D 2D animieren aber wie? Spiele- und Multimedia-Programmierung 48
D Focus richtig setzen? Aber wie ? Spiele- und Multimedia-Programmierung 2
R Verschieben von Objekten langsam Spiele- und Multimedia-Programmierung 0
W Spiel ist langsam/laggt Spiele- und Multimedia-Programmierung 18
B LWJGL Display.update() ist langsam Spiele- und Multimedia-Programmierung 5
X TiledMap "langsam" verschieben Spiele- und Multimedia-Programmierung 8
1 Ping Pong langsam Spiele- und Multimedia-Programmierung 13
M Robot zu langsam Spiele- und Multimedia-Programmierung 4
T Java zu langsam Spiele- und Multimedia-Programmierung 22
T BufferedImage#setRGB #getRGB zu langsam Spiele- und Multimedia-Programmierung 4
B Buttontexte langsam nacheinander erscheinen lassen Spiele- und Multimedia-Programmierung 3
T Mein Vektor-Zeichenprogramm ist zu langsam Spiele- und Multimedia-Programmierung 4
P bildskalierung zu langsam Spiele- und Multimedia-Programmierung 4
J soundlösung zu langsam für spiele Spiele- und Multimedia-Programmierung 16

Ähnliche Java Themen

Neue Themen


Oben