Zu den Aufzeichnungen der tutorials.de-Live-Workshops
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
27
ZUGRIFFE
2416
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    thomy800 thomy800 ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    242
    Hi,

    ich bin auf der Suche nach einem geeigneten Algorithmus, den kürzesten Weg von A nach B zu finden.
    Meine Umgebung (2D) besteht
    a) aus Vektoren in einer Liste. Dies sind Linien mit einem Anfang und einem Ende, die bunt auf dem Feld verteild sind.
    b) zusätzlich habe ich ein n*m-Feld aus boolischen Werten, wo diese Linien eingetragen sind.
    Ich denke, man braucht dafür nur a) oder b) ...

    Ich habe natürlich mal gegoogelt, aber irgendwie finden sich da für meinen Fall nur unpassende Algorithmen, die von Knoten ausgehen (wie A-stern etc.)...
    Kann mir jemand was geeigneteres empfehlen?

    MfG thomy800
     
    Hier kommt der Genuss!

  2. #2
    dki dki ist offline Mitglied
    Registriert seit
    Sep 2008
    Beiträge
    21
    Dijkstra wäre ein Algorithmus der den kürzesten Weg von A nach B bestimmt

    http://de.wikipedia.org/wiki/Dijkstra-Algorithmus
     

  3. #3
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.724
    Blog-Einträge
    29
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  4. #4
    thomy800 thomy800 ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    242
    Hmm.. die beiden Links sind aber genau das, was nicht geht. Mein Problem liegt nicht umbedingt darin, den kürzesten weg zu finden, sondern viel eher, überhaupt einen zu finden, der nicht kollidiert.
    Ich habe mal ein Bild erstellt, wo Beispiellinien (die Hindernisse) eingetragen sind, und 2 Wege, die als Resultat ausgespuckt werden sollten.
    Der Knackpunkt ist z.B. so eine Kurve. Würde ich dem Weg das Ende der Linie als Zwischenpunkt übergeben, dann hätte ich automatisch eine Kollision, was der Algorithmus ja gerade versucht zu vermeiden. Also muss ich einen gewissen Abstand einhalten. Aber in welche Richtung soll der Abstand gehen? senkrecht/waagerecht zur Linie? Oder mehrere zwischenPunkte in eine Kurve einfügen? Wenn ja, wie soll die Kurve aussehen? Ich weiß ja beim generieren des Wegs noch nicht, wie die nächste Linie aussieht, und die nächste Linie ist ja von der Kurve abhängig..
    War das etwas verständlich?
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken Algorithmus -  Weg finden-weg.png  
    Geändert von thomy800 (05.02.10 um 22:53 Uhr)
     
    Hier kommt der Genuss!

  5. #5
    Avatar von SilentWarrior
    SilentWarrior SilentWarrior ist offline Mitglied Diamant
    Registriert seit
    Dec 2001
    Beiträge
    3.078
    Dann musst du das Problem eben auf eines reduzieren, das mit Dijkstra lösbar ist. Dazu erstellst du aus deinem Problem einen Graphen, der als Knoten die Endpunkte aller „Mauern“ sowie den Start- und Endpunkt hat. Eine Kante zwischen zwei Knoten hat es genau dann, wenn diese durch eine gerade Linie miteinander verbunden werden können. Kantengewichte sind einfach die Distanz zwischen zwei Punkten. Der kürzeste Weg auf diesem Graphen ist auch der kürzeste Weg für dein Problem.
     

  6. #6
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.772
    Blog-Einträge
    5
    Hallo,

    du könntest dir einen Graphen derart definieren:
    • Die Knotenmenge enthält genau den Start und das Ziel sowie sämtliche Eck-/Endpunkte deiner Streckenzüge.
    • Zwei Knoten sind genau dann über eine Kante verbunden, wenn sie sich „sehen“ können, also die direkte Verbindungslinie kein Hindernis schneidet. Zwei Knoten, zwischen denen eine Strecke verläuft, sollen auch über eine Kante verbunden sein.
    • Das Kantengewicht ist einfach der euklidische Abstand der jeweiligen Knoten.

    Darauf kannst du dann Dijkstra, A*, etc. anwenden.

    Grüße,
    Matthias

    \edit: Ach, zu langsam.
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  7. #7
    thomy800 thomy800 ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    242
    Das ist ne Idee
     
    Hier kommt der Genuss!

  8. #8
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.772
    Blog-Einträge
    5
    Hallo,

    mir ist gerade aufgefallen, dass es doch nicht ganz so einfach ist. Würde man den Graphen so wie von SilentWarrior und mir vorgeschlagen aufbauen, könnte man an Eckpunkten von Hindernissen durch diese hindurchlaufen. Man kann das Problem aber lösen, indem man für solche Eckpunkte mehrere Knoten erzeugt. Ich hab grade keine Zeit mir zu überlegen, wie das dann genau vonstatten gehen müsste. Aber nur mal als Warnung, dass der von uns geschilderte „naive“ Ansatz nicht funktionieren wird.

    Grüße,
    Matthias
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  9. #9
    thomy800 thomy800 ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    242
    Ja, das ist mir auch schon aufgefallen. Bin aber noch am grübeln wie man das am besten löst..
     
    Hier kommt der Genuss!

  10. #10
    Avatar von SilentWarrior
    SilentWarrior SilentWarrior ist offline Mitglied Diamant
    Registriert seit
    Dec 2001
    Beiträge
    3.078
    Ich würde einfach für jede Mauer zwei Kanten und entsprechend vier Knoten machen. Die beiden Endknoten werden verbunden, wenn keine andere Mauer anliegt (und somit der Weg zur anderen Seite der Mauer nicht versperrt ist.
     

  11. #11
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.724
    Blog-Einträge
    29
    Hallo,

    poste doch mal bitte ein paar Beispieldaten, mit dem man etwas herumspielen kann...

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  12. #12
    thomy800 thomy800 ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    242
    @ SilentWarrior:
    Ich glaube daraus lässt sich was machen
    Man kann zusätzlich zu den Linien beim Generieren Rechtecke erstellen, wo die Linie die Mittellinie bildet. Die Rechtecke können dann die Breite 1 (2 Kanten) bekommen und die Länge der Linie (die anderen 2 Kanten).
    An den 4 ecken kommen jeweils Knoten im Abstand r (vorrausgesetzt, sie liegen nicht in oder zu dich an einer anderen Wand). So ist gewehrleistet, dass ein Objekt zwischen den Lücken auch durch passt.

    @ Thomas Darimont:
    An was für Daten denkst du da? Ein Bildchen hatte ich ja schon erstellt (wo dementprechend Bsp-Daten eingetragen sind).
    Geändert von thomy800 (06.02.10 um 13:38 Uhr)
     
    Hier kommt der Genuss!

  13. #13
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.724
    Blog-Einträge
    29
    Hallo,

    @ Thomas Darimont:
    An was für Daten denkst du da? Ein Bildchen hatte ich ja schon erstellt (wo dementprechend Bsp-Daten eingetragen sind).
    Ich meine ein konkretes Beispiel mit Daten zu deinem Szenario:
    Meine Umgebung (2D) besteht
    a) aus Vektoren in einer Liste. Dies sind Linien mit einem Anfang und einem Ende, die bunt auf dem Feld verteild sind.
    b) zusätzlich habe ich ein n*m-Feld aus boolischen Werten, wo diese Linien eingetragen sind.
    Das Bild hilft dein Problem zu beschreiben... aber ohne sich erst selber Beispieldaten zu machen kann man dein Problem nur theoretisch bearbeiten...
    Du könntest dir ja ein sinnvolles Datenformat ausdenken und dein Beispiel darin beschreiben. Dann kann man mit diesen Beispieldaten rumspielen.

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  14. #14
    thomy800 thomy800 ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    242
    Etwas in der Art?

    Radius r (Abstand) = 1
    Linien: 2 (Vektorform)
    Weg: hier nur einer, auch in Vektorform
    Start (0|0) und Ende (7|6) sind eingetragen.
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken Algorithmus -  Weg finden-weg1.png  
    Geändert von thomy800 (06.02.10 um 14:26 Uhr)
     
    Hier kommt der Genuss!

  15. #15
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.724
    Blog-Einträge
    29
    Hallo,

    ich dachte da eher an ein textformat (ähnlich wie wir es auch bei unseren coding quizes machen) das man leicht im programm einlesen kann.
    Will man jetzt Beispiel nachmachen muss man die Linien / Punktkoordinaten erst noch aus dem Bild rausfummeln... den Schritt könntest du uns ersparen

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

Ähnliche Themen

  1. Algorithmus finden bei Zahlenrätsel "Wolkenkratzer"
    Von Superior99 im Forum Coders Talk
    Antworten: 3
    Letzter Beitrag: 27.12.10, 17:23
  2. Algorithmus um zusammenhängende Flächen zu finden
    Von trench140 im Forum Algorithmen & Datenstrukturen mit Java
    Antworten: 5
    Letzter Beitrag: 21.08.10, 17:53
  3. Algorithmus: 2 Gleiche Daten finden
    Von Nord-Süd-Richtung im Forum Coders Talk
    Antworten: 0
    Letzter Beitrag: 03.05.10, 18:03
  4. Algorithmus um Vertex zu finden
    Von kuhlmaehn im Forum Coders Talk
    Antworten: 7
    Letzter Beitrag: 23.09.08, 15:31
  5. Algorithmus finden
    Von anyany im Forum Visual Basic 6.0
    Antworten: 3
    Letzter Beitrag: 02.03.07, 23:14