Pathfinding - Contest [Beendet]
Übersicht

Matthias |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
OK. Aber drozdem würde ich mir wünschen das die Testmap schon offengelegt wird.
Denn ich bin der Meinung das mann bei großen Maps. Andere Methoden anwenden muß als bei Kleinen. Also wie groß ist das Map Maximal??. |
||
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Integrier doch einfach eine Abfrage und verwende unterschiedliche Funktionen, wenn Du meinst, es wäre angebrachter, dies für die jeweiligen Map-Grössen zu unterscheiden. ![]() Ein guter Pathfinder sollte schon in der Lage sein, mit einer unbekannten Map klarzukommen ... *räusper* ... wie auch immer er dies bewerkstelligt ... |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das ist unrealistisch Ava
Immerhin die Grössenordnung der Map sollte bekannt sein. 32x32? 256x256? 1024x1024? Denn während für ersteres etwas funktionieren mag, so kann man eigentlich garantieren das es bei letzterem nimmer funktionieren wird. Eine andere Frage: Ich nehme an das in der gleichen map einige dutzend verschiedene Pfade berechnet werden, mehrfach (wegen CPU Variationen), richtig? Nicht nur einer und gut ist. Denn Caching ist ein "normaler Vorgang" für Wegfindung, macht aber keinen Sinn wenn pro Map nur eine Berechnung erfolgt. Besonders bei grossen Maps macht es einen recht extremen Unterschied. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Verstehe ich nicht, warum das unrealistisch ist, sorry. Ich habe in meinem ganzen Leben noch keine einzige Pathfinder-Funktion programmiert, die nur auf einer einzigen Map bzw. bei konstanter Map-Grösse funktioniert hat - auf so eine blöde Idee wäre ich nie gekommen...
Das die Karten-Dimensionierung übergeben werden bzw. abrufbar sein muss, ist denke ich selbstverständlich ... Aber wenn ein Pathfinder ne 512x512 Map schafft und dann bei 256x256 nur Grütze auswirft oder sich erhängt, weil plötzlich mal ne Wand woanders steht, als wie er das "gelernt" hat ... dann ist das schon sehr bedenklich und auch traurig ... |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das Problem ist eher umgekehrter Natur.
In normalen Situationen wirst du nichts mit ner 1024er map befeuern ausser du hast das Path Finding System (das ist nicht mit einer einzelnen Funktion zu meistern) darauf ausgelegt und speicherst entsprechende "Toplevel Pfade" zwischen Zellen der Map Von daher ist es unerlässlich die Grösse der Map zu wissen, damit man in etwa abschätzen kann wieviel "Management Overhead" sinnvoll ist zu implementieren. Denn wenn alle maps 64x64 und kleiner sind ist es total sinnlos dafür komplexere Algorithmen zu nutzen, denn die werden vom Overhead dann ausgenockt. Eher Dijkstra, A*, Hierarchie basierende Ansätze, Potenzfelder, ... ?? Ich hoffe das Problem leuchtet jetzt ein. Es geht nicht drum obs geht, es geht drum wie ineffizient es wird aufgrund von Overheads die bei grösseren Maps ausgeglichen werden und anderen Faktoren. Von daher würde ich mir folgende Spezifikationen wünschen: 1. Wird es auf einer Map mehr als 1 Pfad berechnet? (-> Caching und ähnliche Mechanismen) 2. Wie viele Maps wird es geben, welche Grossen sind dabei zu erwarten? |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Nein, ich verstehe Dein Problem nicht bzw. warum meine Aussage unrealistisch war, da Du ansich nur meinen Denkansatz wiederholst.
Ein gutes Pathfinding-System muss meiner Aufassung nach klug genug sein, die optimale Methode anhand der übergeben Parameter auszuwählen und so dann auch gegebenfalls auf unterschiedliche Lösungswege / Algorythmen zurückzugreifen. Aber wahrscheinlich denke ich schon wieder viel zu überdimensional ... zumal ich es zeitlich wohl doch nicht schaffen werde, am Contest teilzunehmen. ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Eigentlich hast du recht. Aber eben, der contest ist nicht so ausgelegt, das etwas derart komplexes sinn macht, da der entwicklungsaufwand dann easy 100 stunden überschreitet und das ist es definitiv net wert wenn die sources dann "frei raus gehen" zumindest nicht für mich und vermutlich auch sonst nur wenige die eine flexible effiziente lösung implementieren könnten in Blitz3D | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
BIG BUG |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Dreamora hat schon recht.
Gut möglich dass der eine Algo bei 32*32 und ein anderer Algo bei 512*512 der schnellste ist. Wer gewinnt? Es sollte also entweder ein gewisser Rahmen vorgegeben oder eben über diverse Map-Größen getestet und Punkte vergeben werden. Aber wenn es wieder nur bei einem Teilnehmer bleibt, hat sich das Problem sowieso erübrigt ![]() |
||
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final) |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Testen werde ich die Funktionen auf Mapgrössen von 32x32 bis 256x256 - sprich 4 verschiedene Maps (alles mit Seitenlängen von Zweierpotenzen).
Es werden auf jeder Map 3 verschiedene Pfade abgefragt - Caching und ähnliche Methoden seien erlaubt, wer dies für nötig hält. StepTiger: Die Arraygrösse ist gegeben durch die Globalen MapWidth und MapHeight. Zitat: Das Array beginnt bei 0, hat also die Grösse MapWidth - 1, MapHeight - 1.
BIG BUG: Wie bereits erwähnt, werden die Ergebnisse zusammengezählt; der Algorithmus, der im Durchschnitt am schnellsten ist, gewinnt also. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Jut jut, danke ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
NoobodyBetreff: Ende Gelände |
![]() Antworten mit Zitat ![]() |
---|---|---|
*tsching*
Mit einiger Verspätung läute ich hiermit den Schlussgong für den Contest. Eine Auswertung war diesmal nicht nötig, da unglücklicherweise (trotz der grossen Resonanz) nur ein einziger teilgenommen hat. Hiermit überreiche ich den Preis des "King of Pathfinding 2008" an Lobby! Sein abgegebener Code: [AUSKLAPPEN] ;Vorbereitungen
Graphics 400,300,32,2 SetBuffer BackBuffer() Global MapWidth%=20,MapHeight%=10 Dim MapData(MapWidth-1,MapHeight-1) Dim Array(MapWidth-1,MapHeight-1) ;Mauer erstellen MapData(7,5)=1 MapData(7,6)=1 MapData(7,7)=1 ;Punkte festlegen StartX%=2 StartY%=2 EndX%=8 EndY%=6 timer=CreateTimer(48) While 1 ams=MilliSecs() ;Funktionsaufruf fp$=FindPath$(StartX,StartY,EndX,EndY) ms=MilliSecs() fps#=(1000.0/(ms-ams))*0.5+fps*0.5 ;Grafische Darstellung Cls For y=0 To MapHeight-1 For x=0 To MapWidth-1 If MapData(x,y)=0 Then Color 155,155,155 Rect x*20,y*20,19,19 Else Color 255,255,255 Rect x*20,y*20,19,19 Color 55,55,55 Rect x*20+1,y*20+1,18,18 Color 88,88,88 Rect x*20+1,y*20+1,17,17 Color 55,55,55 Text x*20+5,y*20+3,"M" EndIf Next Next x=StartX y=StartY t$=fp While t$<>"" nt$=Mid(t,1,1) ax=x ay=y Select nt Case 6 x=x+1 Case 2 y=y+1 Case 4 x=x-1 Case 8 y=y-1 Case 3 x=x+1 y=y+1 Case 1 x=x-1 y=y+1 Case 7 x=x-1 y=y-1 Case 9 x=x+1 y=y-1 End Select Color 255,255,255 Rect x*20,y*20,19,19 Color 155,155,0 Line ax*20+10,ay*20+10,x*20+10,y*20+10 t=Mid(t,2) Wend Color 255,255,255 Rect StartX*20,StartY*20,19,19 Color 0,155,0 Rect StartX*20+1,StartY*20+1,18,18 Color 0,255,0 Rect StartX*20+1,StartY*20+1,17,17 Color 0,155,0 Text StartX*20+5,StartY*20+3,"S" Color 255,255,255 Rect EndX*20,EndY*20,19,19 Color 155,0,0 Rect EndX*20+1,EndY*20+1,18,18 Color 255,0,0 Rect EndX*20+1,EndY*20+1,17,17 Color 155,0,0 Text EndX*20+5,EndY*20+3,"E" Color 255,255,255 Text 0,220,"Weg: "+fp t$=fps If t="Infinity" Then t=">1000" fps=0 EndIf Text 0,240,t+" FPS("+nms+"ms)" Text 0,260,"LMT um den Startpunkt zu setzen" Text 0,272,"RMT für den Endpunkt und MRT für Mauer;-)" Flip 0 nms=(ms-ams) mx=MouseX()-10 my=MouseY()-10 x=Int(mx/20.0) y=Int(my/20.0) If MouseDown(1) Then StartX=x StartY=y EndIf If MouseDown(2) Then EndX=x EndY=y EndIf If MouseHit(3) Then If x<=MapWidth-1 And y<=MapHeight-1 Then MapData(x,y)=1-MapData(x,y) EndIf EndIf WaitTimer timer Wend ;Funktionen & Types_________________________________________________________ Function FindPath$(StartX%,StartY%,EndX%,EndY%) If StartX<0 Or StartY<0 Or EndX>MapWidth-1 Or EndY>MapHeight-1 Or StartX>MapWidth-1 Or StartY>MapHeight-1 Or EndX<0 Or EndY<0 Then Return "" If MapData(StartX,StartY)>0 Or MapData(EndX,EndY)>0 Then Return "" ClearAll() TypeAdd EndX,EndY,Null,"" hz%=MapWidth*MapHeight For z%=0 To hz tw$=TypeWork$(StartX,StartY,EndX,EndY) If tw<>"" Then Return tw Next Return "" End Function Function ClearAll() For Feld.TFeld=Each TFeld Delete Feld.TFeld Next For y=0 To MapHeight-1 For x=0 To MapWidth-1 Array(x,y)=0 Next Next End Function Function TypeAdd(x%,y%,ch.TFeld,name$) If x<0 Or y<0 Or x>MapWidth-1 Or y>MapWidth-1 Then Return If MapData(x,y)<>0 Or Array(x,y)<>0 Then Return Feld.TFeld=New TFeld Feld\x=x Feld\y=y Feld\ch=ch Feld\c=0 Feld\movename=name Array(x,y)=1 Return End Function Function TypeWork$(sx%,sy%,zx%,zy%) For Feld.TFeld=Each TFeld If Feld\x=sx And Feld\y=sy Then t$="" Feld2.TFeld=Feld.TFeld While Feld2.TFeld<>Null t$=t$+Feld2\movename Feld2.TFeld=Feld2\ch.TFeld Wend Return t ElseIf Feld\c=0 Then TypeAdd Feld\x+1,Feld\y,Feld.TFeld,4 TypeAdd Feld\x,Feld\y+1,Feld.TFeld,8 TypeAdd Feld\x-1,Feld\y,Feld.TFeld,6 TypeAdd Feld\x,Feld\y-1,Feld.TFeld,2 TypeAdd Feld\x+1,Feld\y+1,Feld.TFeld,7 TypeAdd Feld\x+1,Feld\y-1,Feld.TFeld,1 TypeAdd Feld\x-1,Feld\y+1,Feld.TFeld,9 TypeAdd Feld\x-1,Feld\y-1,Feld.TFeld,3 Feld\c=1 EndIf Next End Function Type TFeld Field x% Field y% Field ch.TFeld Field c% Field movename$ End Type Wenn er will, kann er gerne einen neuen Contest starten, jedoch ist die Beteiligung jeweils eher gering (leider). |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
da_poller |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ich will nciht kritisieren aber der code erzeugt bei mir einen mav in folgender zeile:
Code: [AUSKLAPPEN] If MapData(StartX,StartY)>0 Or MapData(EndX,EndY)>0 Then Return ""
Array index out of bounds liegts an mir oder gewinnt ein verbuggter code? |
||
![]() |
Lobby |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja da_poller, da is nen Bug drinn ![]() Ich bin dafür diese Titelwettbewerbe in Zukunft mit 'echten' Titeln zu machen (die dann unter dem Nick des Siegers stehen), dazu wäre jedoch zuerst eine Absprache mit den entsprechenden Personen (Admins/Mods) nötig. An dieser Stelle beende ich diese Wettbewerbe vorerst einmal, ihr könnt ja wieder einen mit Absprache organisieren für den Fall das ihr das hinkriegt ![]() Hier noch der funktionierende Code(für die die den Fehler nochnicht entdeckt haben): Code: [AUSKLAPPEN] ;Vorbereitungen
Graphics 400,300,32,2 SetBuffer BackBuffer() Global MapWidth%=20,MapHeight%=10 Dim MapData(MapWidth-1,MapHeight-1) Dim Array(MapWidth-1,MapHeight-1) ;Mauer erstellen MapData(7,5)=1 MapData(7,6)=1 MapData(7,7)=1 ;Punkte festlegen StartX%=2 StartY%=2 EndX%=8 EndY%=6 timer=CreateTimer(48) While 1 ams=MilliSecs() ;Funktionsaufruf fp$=FindPath$(StartX,StartY,EndX,EndY) ms=MilliSecs() fps#=(1000.0/(ms-ams))*0.5+fps*0.5 ;Grafische Darstellung Cls For y=0 To MapHeight-1 For x=0 To MapWidth-1 If MapData(x,y)=0 Then Color 155,155,155 Rect x*20,y*20,19,19 Else Color 255,255,255 Rect x*20,y*20,19,19 Color 55,55,55 Rect x*20+1,y*20+1,18,18 Color 88,88,88 Rect x*20+1,y*20+1,17,17 Color 55,55,55 Text x*20+5,y*20+3,"M" EndIf Next Next x=StartX y=StartY t$=fp While t$<>"" nt$=Mid(t,1,1) ax=x ay=y Select nt Case 6 x=x+1 Case 2 y=y+1 Case 4 x=x-1 Case 8 y=y-1 Case 3 x=x+1 y=y+1 Case 1 x=x-1 y=y+1 Case 7 x=x-1 y=y-1 Case 9 x=x+1 y=y-1 End Select Color 255,255,255 Rect x*20,y*20,19,19 Color 155,155,0 Line ax*20+10,ay*20+10,x*20+10,y*20+10 t=Mid(t,2) Wend Color 255,255,255 Rect StartX*20,StartY*20,19,19 Color 0,155,0 Rect StartX*20+1,StartY*20+1,18,18 Color 0,255,0 Rect StartX*20+1,StartY*20+1,17,17 Color 0,155,0 Text StartX*20+5,StartY*20+3,"S" Color 255,255,255 Rect EndX*20,EndY*20,19,19 Color 155,0,0 Rect EndX*20+1,EndY*20+1,18,18 Color 255,0,0 Rect EndX*20+1,EndY*20+1,17,17 Color 155,0,0 Text EndX*20+5,EndY*20+3,"E" Color 255,255,255 Text 0,220,"Weg: "+fp t$=fps If t="Infinity" Then t=">1000" fps=0 EndIf Text 0,240,t+" FPS("+nms+"ms)" Text 0,260,"LMT um den Startpunkt zu setzen" Text 0,272,"RMT für den Endpunkt und MRT für Mauer;-)" Flip 0 nms=(ms-ams) mx=MouseX()-10 my=MouseY()-10 x=Int(mx/20.0) y=Int(my/20.0) If MouseDown(1) Then StartX=x StartY=y EndIf If MouseDown(2) Then EndX=x EndY=y EndIf If MouseHit(3) Then If x<=MapWidth-1 And y<=MapHeight-1 Then MapData(x,y)=1-MapData(x,y) EndIf EndIf WaitTimer timer Wend ;Funktionen & Types_________________________________________________________ Function FindPath$(StartX%,StartY%,EndX%,EndY%) If StartX<0 Or StartY<0 Or EndX>MapWidth-1 Or EndY>MapHeight-1 Or StartX>MapWidth-1 Or StartY>MapHeight-1 Or EndX<0 Or EndY<0 Then Return "" If MapData(StartX,StartY)>0 Or MapData(EndX,EndY)>0 Then Return "" ClearAll() TypeAdd EndX,EndY,Null,"" hz%=MapWidth*MapHeight For z%=0 To hz tw$=TypeWork$(StartX,StartY,EndX,EndY) If tw<>"" Then Return tw Next Return "" End Function Function ClearAll() For Feld.TFeld=Each TFeld Delete Feld.TFeld Next For y=0 To MapHeight-1 For x=0 To MapWidth-1 Array(x,y)=0 Next Next End Function Function TypeAdd(x%,y%,ch.TFeld,name$) If x<0 Or y<0 Or x>MapWidth-1 Or y>MapHeight-1 Then Return If MapData(x,y)<>0 Or Array(x,y)<>0 Then Return Feld.TFeld=New TFeld Feld\x=x Feld\y=y Feld\ch=ch Feld\c=0 Feld\movename=name Array(x,y)=1 Return End Function Function TypeWork$(sx%,sy%,zx%,zy%) For Feld.TFeld=Each TFeld If Feld\x=sx And Feld\y=sy Then t$="" Feld2.TFeld=Feld.TFeld While Feld2.TFeld<>Null t$=t$+Feld2\movename Feld2.TFeld=Feld2\ch.TFeld Wend Return t ElseIf Feld\c=0 Then TypeAdd Feld\x+1,Feld\y,Feld.TFeld,4 TypeAdd Feld\x,Feld\y+1,Feld.TFeld,8 TypeAdd Feld\x-1,Feld\y,Feld.TFeld,6 TypeAdd Feld\x,Feld\y-1,Feld.TFeld,2 TypeAdd Feld\x+1,Feld\y+1,Feld.TFeld,7 TypeAdd Feld\x+1,Feld\y-1,Feld.TFeld,1 TypeAdd Feld\x-1,Feld\y+1,Feld.TFeld,9 TypeAdd Feld\x-1,Feld\y-1,Feld.TFeld,3 Feld\c=1 EndIf Next End Function Type TFeld Field x% Field y% Field ch.TFeld Field c% Field movename$ End Type |
||
da_poller |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
lobby wollte dich damit nicht kritisieren obwohl dein code fehler haft war(hab den neuen nicht getestet) hab ich riesen respekt da das thema pathfinding für mcih noch ein buch mit 7 siegeln ist.. bin froh das ich netztwerk erstmal soweit hinbekomme ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group