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

Geheim

Treue Seele

  • »Geheim« ist der Autor dieses Themas

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

1

08.06.2012, 15:51

Fragen zu A* Algorithmus

Hey Leute,
Ich habe in den letzten 2 Tagen einen A* Algorithmus programmiert, der ansich auch funktioniert.

Zu den Fragen:
1) Wie schnell soll/darf der sein?
2) Bei meinem A* funktioniert etwas nicht unbedingt so wie ich es mir vorgestellt habe: Ich dachte der sucht mir den kürzesten Weg?
Am besten sieht man mein Problem, wenn man den Start ganz links hat, das Ziel ganz rechts und eine Wand in der Mitte durchzieht, die 1 Block ganz unten freihält: Dann geht der Weg zuerst gerade und erst an der Wand geht er nach unten Richtung freien Block und dann zum Ziel. Ich dachte er geht sofort runter, wisst ihr was ich meine?^^

Ich hab ihn mithilfe vom Wiki gemacht. Nur statt in 4 Richtungen in 8 ;)

Geht das mit dem A* nicht anders oder hab ich was vergessen/falsch gemacht?

MfG Geheim!

ProAmateur

Alter Hase

Beiträge: 434

Wohnort: Bei Simmern, Koblenz

Beruf: Schüler

  • Private Nachricht senden

2

08.06.2012, 16:27

Also zu seinem ersten; ich Dächer Wer sollte immer möglichst schnell sein, aber halt relativ zu seinem Verwendungszweck.
Das heißt, wenn du ihn in einem Spiel in jeden Frame aufrufen willst, sollte er nicht 2 mim dauern, aber wenn er irgendwas planen soll zb die Route von einer Stadt zur anderen ist es nicht schlimm, wenn er auch mal 20 Sek dauert.
Kommt halt immer drauf an...
Und zu deinem zweiten, wäre es vll mal gut, wenn du aus Paint ein Bild malst und das dann hochlädst. Dann kann man dir besser Folgen :D
"Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will."
Galileo Galilei
________________________________________________________________________

"Dumme Fragen gibt es nicht, dumm ist nur, wer nicht fragt.“

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

08.06.2012, 16:27

Problem bitte illustieren. Ich bin ein ziemlich fantasieloser Mensch und kann es mir so nicht vorstellen. Frage 1 verstehe ich nicht ganz. Vorallem hängt das sehr stark von der Implementierung ab. Frage 2 kann ich in sofern beantworten, dass a-star definitiv den kürzesten Weg findet, wenn es einen gibt. Wenn es anders zu sein scheint, oder ist, dann liegt das nicht am a-star sondern an dessen Implementierung durch dich, womit wir wieder beim Anfang wären; ich bräuchte ehrlich gesagt ein Bildchen. Sind die Kantenlängen alle auf 1 normiert (sprich keine unterschiedlichen Wegkosten)?

Aaaaber wenn ich deine Beschreibung richtig verstehe, würde ich mal gegenfragen, warum du denn meinst, dass dein Weg günstiger sein sollte. Dein Problem lässt sich sogar auf 2x2 Knoten reduzieren. Wenn alle Kantenkosten gleich sind, dann ist es egal ob man erst nach rechts und dann nach unten oder erst nach unten und dann nach rechts geht.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Geheim

Treue Seele

  • »Geheim« ist der Autor dieses Themas

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

4

08.06.2012, 16:40

Frage 1) ist relativ überflüssig :rolleyes:

Zu Frage 2)
Wenn ich Start links habe und Ziel rechts, dann siehts so aus:


Und es sollte doch eher so sein: (Da habe ich jetz ein Paar Hindernisse hinzugefügt)

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

5

08.06.2012, 16:46

Und warum sollte es das sein? Siehe mein beispiel. Du hast ja nur 4 Richtungen, also keine Diagonalen. Sprich warum sollte er diagonal gehen? Vorallem gibt ja die Heuristik an dass "nach rechts" viel günstiger als "nach unten" ist, da du wahrscheinlich die euklidische Norm wähltest und sich das Ziel ja Rechts vom Start befindet und nciht unter oder oberhalb.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Geheim

Treue Seele

  • »Geheim« ist der Autor dieses Themas

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

6

08.06.2012, 16:51

Klar hab ich Diagonalen ;) (sieht man doch?^^)
Und ich geh vom nähesten (kleinstes F) Block aus (Wenn 2 gleichweit weg sind, dann kommt das mit der Heuristik ;) )

Aber ich versteh die Vorgangsweiße von A*, das F ist bis zur Wand ja das kleinste :D Nur macht das jeder A* so? Wie kann ich ihn erkennen lassen, dass er schon vorher Diagonal muss?^^

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

7

08.06.2012, 16:56

Ahh dann habe ich mich verlesen. Dachte du schriebst dass du 4 statt 8 Richtungen hast und nicht umgekehrt. Tja, dann ist wohl deine Kostenberechnung fürn A*. Oder du sortierst den Kontainer nicht korrekt (boost priorityqueue soll ganz gut sein für diesen Zweck).
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Geheim

Treue Seele

  • »Geheim« ist der Autor dieses Themas

Beiträge: 202

Wohnort: Salzburg

Beruf: Schüler

  • Private Nachricht senden

8

08.06.2012, 16:59

C-/C++-Quelltext

1
2
3
4
bool operator<(const Block &First, const Block &Second) //Sortiert die Blöcke nach ihrem F (vom niedrig bis hoch)
{
    return First.GetF() < Second.GetF();
}


So lass ich es sortieren und dann eben mit List.sort();
Ich weiß nicht woher der Algorithmus wissen soll, dass irgendwo eine Wand kommen wird, und er schon vorher abbiegen soll^^

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

08.06.2012, 17:31

Ahja...und wie ist Block bzw. F definiert? Wie berechnest du F? geschätzte + bisherige Kosten?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

10

08.06.2012, 17:32

Ich denke, du verwendest die Manhattenlänge.

Du musst in die Länge schon die Diagonalen miteinbeziehen
Wenn X und Y Koordianten des Vektors zum Ziel sind:
Max = max(abs(X), abs(Y))
Min = min(abs(X), abs(Y))
Distanz = Min * 141 + (Max - Min) * 100

Werbeanzeige