Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

21

30.10.2013, 18:56

Ja, das kann man alles noch verbessern. Aber soll ich das jetzt alles im Detail aufzaehlen? Vor allem da es eher Trivialitaeten und auch persoenliche Vorlieben sind.

Das kann man laut deiner Aussage alles noch verbessern. Du fragst ob du alles im Detail aufzählen sollst. Stattdessen könntest du ja einfach einzelne Punkte aufgreifen. Es sind laut deiner Aussage Trivialitäten "und" auch persönliche Vorlieben. Klar persönliche Vorlieben brauchst du nicht aufzeigen, aber was für dich trivial ist, ist es für Fireball anscheinend nicht, sonst hätte er nicht gefragt. Und auf diese Punkte hättest du doch eingehen können. Mehr wollte ich gar nicht. Warum ich deswegen anscheinend schlecht lese ist mir da nicht ganz klar TGGC. Pass auf, ich setz mich hin und übe an meinen Skills im lesen und dafür setzt du dich hin und verbessert deine Skills im freundlichen Umgang.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

22

30.10.2013, 23:37

Eben, ich frage ob ich es aufzaehlen soll. Da mit einer Gegenfrage zu antworte, warum ich denn nichts aufzaehle, ist etwas albern. Hast doch grad selbst gesagt, ich soll einzelne Punkte rausgreifen und nicht alles aufzaehlen. Warum soll ich denn nicht alle aufzaehlen?

Also um mal einigiges herauszugreifen: Was mich am meisten stoert, sind die vielen Informationen die quer durch den Code verteilt sind. Mit A* selbst hat das aber ueberhaupt nichts zu tun. Beispielsweise ist an 5 Stellen die 10/14 als Distanzen definiert oder an 3 Stellen die Anzahl und Anordung der Nachbarknoten. Das kann keiner ueberschauen. Der Algorithmus, der die Karte visualisiert ist theoretisch auch unnoetig zerteilt. Einmal ist er in der Nodemap, die bei bestimmten Bedingungen eine Zeichen waehlt, aber gleichzeitig auch ueberall, wo "sign" gesetzt wird.

Dann finde ich diese getNeigbor Methode schlimm. Erstmal diese komische Pointersyntax, ist die wirklich noetig? Dann der im Prinzip gleiche Code untereinanderkopiert, waehrend andere Stellen auch noch von diesem Format abhaengig sind. Bei Aenderungen wieder kaum zu beherrschen. Die elegante Methode mit etwas Overhead waere hier sicher eine Array ueber die Beschreibung der 8 Nachbarn, z.b. OffsetX, OffsetY, Distance. Das saehe dann etwa so aus:

C-/C++-Quelltext

1
getNodeFromMap(x+neighbour_desc[neighbour_id].OffsetX, y+neighbour_desc[neighbour_id].OffsetY);

Sollte man irgendwann feststellen, das es hier zu einem Hotspot kommt, empfehle ich dann uebrigens folgendes:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
// keeping all the information about current node to expand in members
m_CurPosX = x;
m_CurPosY = y;
m_CurNode = node;
// etc.

//"loop" over all neighbours
VisitNeighbour(x+1,y,Dist_Straight);
VisitNeighbour(x,y+1,Dist_Straight);
VisitNeighbour(x-1,y,Dist_Straight);
VisitNeighbour(x,y-1,Dist_Straight);
VisitNeighbour(x+1,y+1,Dist_Diagonal);
//etc..

Was VisitNeighbour macht, ist klar, oder?

Dritter Punkt: wenn das nicht nur ein Test, sondern ein ernsthafter Versuch eines performanten Algorithmus wird, sollte man sich gleich ueber die Datenstrukturen klar werden. Hier ist im Prinzip alle Information in der Node zusammengeschmissen. Das macht IMHO aber nicht viel Sinn. Zum Beispiel sind die Informationen, ob ein Feld begehbar sind, in der Node abgespeichert. Diese Daten sind aber nur Eingabedaten, die sollten woanders liegen. Die Wegsuche ist einer der Algorithmen die darauf zugreifen, aber nur lesend. Dann gibts Informationen zur Visualisierung, was mit dem Algorithmus auch nichts zu tun hat. Dann gibts noch einen Teil Daten, wo man sich nochmal fragen sollte, ob die wirklich noetig sind. Man muss bedenken, dass man erstmal den Speicher fuer die Node besorgen (auch in dem Sinne das er in den Cache geladen wird) muss und ihn dann initialisiert. Diese Datenstruktur wird danach aber gar nicht so oft gelesen, damit sich diese Ausgaben sich amortisieren koennten.

Und was jeder selber wissen muss, erinnert er sich nach 3 Monaten arbeiten an anderen Modulen noch was H und G bedeutet? Oder lieber gleich Namen wie "DistanceToHere" oder "EstimatedDistanceLeft" benutzen?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

23

31.10.2013, 09:52

Ich bin davon ausgegangen, dass es dir zu viel Arbeit ist alles Punkte aufzuzählen. Es wird ja immerhin nach Hilfe gefragt, wo meiner Meinung nach dann deine Frage hinfällig wird. "Ich brauche Hilfe zur Verbesserung meines Algorithmus. Soll ich alle Verbesserungen aufzählen? Nein, bitte nicht zu viel Hilfe". Das wirkt auf mich wie ein unrealistisches Szenario. Aber möglicherweise fehlt mir auch einfach die Vorstellungskraft. Aber guck, jetzt hast du dir doch was raus gegriffen. Darum ging es doch nur.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

24

31.10.2013, 10:31

Klar persönliche Vorlieben brauchst du nicht aufzeigen

Nein, bitte nicht zu viel (Hilfe)". Das wirkt auf mich wie ein unrealistisches Szenario. Aber möglicherweise fehlt mir auch einfach die Vorstellungskraft.
...

Fireball

Alter Hase

  • »Fireball« ist der Autor dieses Themas

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

25

10.11.2013, 04:24

Hallo zusammen,

ich habe mich heute mal hingesetzt und den Code nochmal überarbeitet. (Hab den Code angepasst, den ich gepostet hatte.)

Mir war wichtig, den ersten Ansatz erstmal lauffähig zu bekommen.

Die Fehler die noch im Code waren ...

1. Die offene Liste wurde nicht aktualisiert
2. Die Heuristik hat nicht gestimmt, der Code berechnet jetzt die Länge eines Vektors und nicht mehr nach Manhattan.
3. Die Heuristik des Nachbarknoten wurde nicht korrekt berechnet.

Der Code ist natürlich nicht perfekt, man kann ihn noch weiter verbessern. Doch ich lasse es hier jetzt gut sein, denn ich habe schon mit einem ganz neuen Ansatz angefangen und da kommt auch keine

C-/C++-Quelltext

1
Node *node = nodeMap->getNeighborFromNode(currentNode->getPosition(),static_cast<NodeMap::Neighbors>(i));
mehr vor. :D

Schöne Grüße

Fb

26

10.11.2013, 14:52

Heyho,

als Heuristik könntest du stattdessen noch die diagonale Distanz verwenden, wie TGGC vorgeschlagen hatte. Die passt am besten, wenn die Bewegungen deiner Objekte an das Grid gebunden sind (horizontale, vertikale + diagonale Bewegungen).

Fireball

Alter Hase

  • »Fireball« ist der Autor dieses Themas

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

27

10.11.2013, 20:10

Heyho,

als Heuristik könntest du stattdessen noch die diagonale Distanz verwenden, wie TGGC vorgeschlagen hatte. Die passt am besten, wenn die Bewegungen deiner Objekte an das Grid gebunden sind (horizontale, vertikale + diagonale Bewegungen).



Super danke für den Link, den ziehe ich mir mal rein. :search:

Schöne Grüße

Fb

Werbeanzeige