Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Jul 16, 2025 17:22

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 37 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
BeitragVerfasst: Di Nov 22, 2005 16:39 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Hallo.

Ich weiß nie wo so Fragen reingehören :-/ Also ab zu den Einsteiger Fragen?
Naja.

Ich habe ne bestimmte Anzahl an Planeten in einer Galaxie.
Wie kann ich jetzt folgendes realisieren:

Will von einem Planeten zum anderen, aber der Treibstoff reicht nicht. muss also über verschiedene Planeten fliegen zum Tanken.
Wie errechne ich mir den kürzesten weg über so wenig Planeten wie möglich?
Allerdings wenn der weg über 1 Planet weiter ist als über 2, dann über 2 planeten.

Wisst ihr was ich meine?

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 22, 2005 17:13 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 16, 2003 15:20
Beiträge: 198
Zitat:
Allerdings wenn der weg über 1 Planet weiter ist als über 2, dann über 2 planeten

Was meinst du ? Der kürzeste Weg ist immer direkt von Planet 1 zu Planet 2, dass ist denke ich
klar, da dieser aber nicht möglich ist (hast du ja ausgeschlossen)
Muss 1 Zwischenstation eingelegt werden. Der weg mit über eine Zwischenstation ist aber
auf alle Fälle kürzer als der Über 2, da :
Start Ziel
\ /
Zwischens.
im gegensatz zu
Start Ziel
\ /
Zwischens.1-------Zwischens.2
(Müsste man in einen gleichen Massstab bringen und die Planeten als Punkte betrachten).
D.h. im 1.Fall wird die Zwischenstation angeflogen, und dann direkt zum Ziel weiter -> 3 Strecken
Im 2.Fall wird die 1.Zwischenstation angeflogen, dann die 2. und dann zum Ziel ->4 Strecken.
Da die kürzeste Verbindung zwischen 2 Punkten aber immer eine Linie ist, ist Fall 1 in jedem Fall
günstiger (OK, das kann ich nicht wirklich erklären, kann auch sein, dass wir total anneinader
vorbei reden)[am einfachsten kann man sich das vorstellen, wenn man
die 1.Zwischenstation als Startpunkt nimmt. Im 1.Fall fliegt man direkt weiter, im 2. macht man einen
Umweg.

Am besten du gibst mal ein Fallbeispiel oder so.

mfG
Tomok

_________________
Bevor du definierst, was etwas ist, versichere dich seiner Existenz.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 22, 2005 17:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Naja ich habs mal in 2D gemalt...

Nicht immer ist der weg über 2 planeten länger als über einen ...
Wie hier zB siehst du das es über 2 kürzer ist, aber das wäre nicht so schlimm.
Ich weiß es momentan nichtmal anzustellen, das ich den nächsten planeten in richtung des ziels aussuchen kann.
(Dazu muss ich sagen, 1 und 4 sind ziel und start)


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
www.audi32.de


Zuletzt geändert von Adler am Di Nov 22, 2005 17:24, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 22, 2005 17:24 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Ich poste mal den Basic-Code von einem Annäherungsverfahren für Planetenbewegung, was ich in meinem Physikbuch entdeckt habe ;)

Oder... Ach was soll's... Hab jetzt doch mal nach Pascal übersetzt ^^:
Code:
  1. program universe;
  2. {$APPTYPE CONSOLE}
  3. uses
  4.   math, SysUtils;
  5. var
  6.   MS, M, G: single;
  7.   X0, VA, Y0, VB: single;
  8.   DT: integer;
  9.   R, FX, FY, AX, AY: single;
  10.   VX, VY: single;
  11.   X, Y: single;
  12.   I: integer;
  13. begin
  14.   MS := 2E30;   M  := 1000; G := 6.672E-11;
  15.   X0 := 1.5E11; VA := 0;
  16.   Y0 := 0;      VB := 2.2E4;
  17.   DT := 24*3600;
  18.  
  19.   for I := 0 to 99999 do
  20.   begin
  21.     R  := sqrt(sqr(X0) + sqr(Y0));
  22.     FX := -G * M * MS * X0 / Power(R, 3);
  23.     AX := FX / M;
  24.     FY := -G * M * MS * Y0 / Power(R, 3);
  25.     AY := FY / M;
  26.     VX := VA + AX * DT;
  27.     VY := VB + AY * DT;
  28.     X  := X0 + VX * DT;
  29.     Y  := Y0 + VY * DT;
  30.  
  31.     // An dieser Stelle enthalten:
  32.     // I: Schritt
  33.     // X: X-Position
  34.     // Y: Y-Position
  35.     // R: Entfernung zur Sonne (Radius)
  36.     //WriteLn(Format('%e, %e; %e, %e', [I, X, Y, R]));
  37.     WriteLn(I, ',', X, ';', Y, ',', R);
  38.  
  39.     X0 := X; VA := VX;
  40.     Y0 := Y; VB := VY;
  41.   end;
  42. end.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 22, 2005 17:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
@ Frase:

Da ist ja auch Grafitation dabei?!
Evtl. habe ich die Frage falsch gestellt... schau dir mal das Bild an was jetzt drin ist, aber trotzdem danke für die Hilfe ;)

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 22, 2005 17:29 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 16, 2003 15:20
Beiträge: 198
Achso, hatte vergessen, dass andere Strecken evtl. auch zu lang sind.

_________________
Bevor du definierst, was etwas ist, versichere dich seiner Existenz.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 22, 2005 17:31 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Achso. Na das ist doch wirlich einfach ^^ Schonmal was vom Satz des Pythagoras gehört? ;)

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 22, 2005 17:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Ja den kann ich, ich kann mir auch die strecken ausrechnen :-D
Ah, jetzt komm ich auf die idee ^^

Also am besten ich geh alle durch zu denen ich anfliegen kann und dann schau ich noch welcher am nächsten am ziel ist?
Aber das kann auch einen ziemlich großen umweg geben :-/
Ich müsste alle möglichen strecken durchgehen und dann addiert die kürzeste?!
Aber das wäre doch unglaublich zum berechnen?! bei so ca. 50 planeten...
Das soll recht zügig gehen (ist jetzt net jeden render durchlauf aber ... meint ihr das ist noch ok)

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 22, 2005 17:42 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das is mal wieder ein hervoragendes Beispiel für eine Problem was man mittels gewichteten Graphen lösen kann.

Also einfach beim erstellen deiner Map (oder wann auch immer) alle Entfernungen zu den möglichen Nachbarn berechnen (die in reichweite liegen) und mit speichern. Danach kannst du ne A* auf deinem Graph laufen lassen. Und fertig.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 22, 2005 17:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Okt 27, 2003 17:46
Beiträge: 788
Da müsste ich viel speichern :-(
Jedes Schiff hat verschiedenen Tank und können (also wenns fertig ist) die Entfernungen entwickeln.

_________________
www.audi32.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 22, 2005 17:53 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Flash hat geschrieben:
Das is mal wieder ein hervoragendes Beispiel für eine Problem was man mittels gewichteten Graphen lösen kann.

Also einfach beim erstellen deiner Map (oder wann auch immer) alle Entfernungen zu den möglichen Nachbarn berechnen (die in reichweite liegen) und mit speichern. Danach kannst du ne A* auf deinem Graph laufen lassen. Und fertig.

Auch wenn wir hier bei den Einsteiger-Fragen sind, klingt mir deine Antwort ein wenig zu einfach. Zum einen, wieso ne komplette A* basteln, wenn es um sowas einfaches geht? Wieso Graphen implementieren, wenn es mit ein paar Additionen getan ist?

Also Adler:
Du speicherst pro Planet, welche Planeten von ihm aus erreichbar sind und wie lange jeder dieser Wege ist.
Später dann, wenn du dein Raumschiff wohin schickst, prüft es rekursiv jeden Planeten in Reichweite und die Länge des Weges dorthin. Und so weiter, bis du schließlich am Ziel bist.

(Wer es nicht gemerkt hat... Das war Pathfinding für PDAs ^^)

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 23, 2005 04:56 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
So einfach ist das leider nicht. Das kann nämlich richtig Zeit kosten das rekursive Prüfen, da du keine Vorzugsrichtung hast. A* hat sowas über seine Heuristik. Deshalb is der auch so fix. Dein Ansatz deckt sich aber mit dem Meinigen (Liste der Nachbarn + Entfernung), nur stellte sich mir die Frage, was ein Nachbar ist, da die Schiffe unterschiedliche Reichweiten haben. @Adler: Du müsstest also ne maximale Reichweite vorgeben. Alle Planeten die in dieser Liegen sind Nachbarn des aktuellen Planeten. Zu jedem Nachbarn speicherst du dann die Entfernung (das ist die Gewichtung der Kante aktPlantet<->Nachbar). Die Planeten sind dann deine Knoten. Somit hast du einen super Graph. Und das tolle an Graphen ist, dass alle Wegfindungsalgorithmen auf diesen Funktionieren. (Z.B. der A*, welcher zweifellos hier gute dienste tun würde).

Weitere Vorteile von Graphen:
    Wenn du dein Universum konstruierst kannst du mit (relativ simplen) Graphalgorithmen herausfinden ob dein Universum zusammenhängen ist (also ob es von jedem Planeten einen Weg zu jedem anderen Planten gibt, oder ob ein Planet soweis außerhalb liegt, dass er niemals erreicht werden kann.

    Deine KI kann mit bestimmten Algorithmen leicht strategisch wichtige Planeten herausfinden (Graphentheorie: Artikulationspunkte) falls welche existieren. Art.Pkte sind Knoten welche zwei Teilgraphen verbinden und die benutzt werden MÜSSEN wenn man von dem einen in den anderen will.

    Alternative Wege finden dürfte auch kein Problem sein.


Also ich sags mal so: Wer immer was mit KI und Wegsuche vorhat, kommt um Graphentheorie und Bäume nicht herum. Alles andere wird Flickwerk. Graphentheorie hingegen ist durch Mathematik und theoretische Informatik erschöpfend untersucht. Da kann man sich drauf verlassen, dass die Algorithmen das machen was sie sollen. ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 23, 2005 14:49 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Dieses Problem löst sich wie folgt:
1. Vorraussetzung: Direkte Entfernungen von jedem Planeten zu jedem anderen bekannt.
Dann kannst Du 2. eine Entfernungsmatrix aufstellen: von, bis, über, entfernung
Hier Du in alle Distanzen der Matrix ein: unendlich, wenn aus 1 Entfernung grösser Reichweite oder direkte Entfernung, wenn kleiner Reichweite (über bleibt leer)
Nach diesem ersten Schritt hast Du 'erreichbarkeitsinseln' geschaffen (alle direkten wege sind notiert)
jetzt kannst du 3. den Berechnungsalgorithmus starten:

wiederhole
für jede ÜBER
für jede VON
für jede BIS
wenn (VON nach ÜBER) + (ÜBER nach BIS)<Eintrag VON nach BIS
Dann Ersetze Entfernung und ÜBER in Eintrag
solange bis keine Ersetzung getätigt

Dieser Algorithmus findet mindestens eine 'gute' lösung, wenn Du Glück hast, die 'optimale'
Wichtig ist, in der äußersten Schleive die ÜBER zu durchlaufen, dann ist der Alg n^3logn, wenn du erst über die VONs iterierst, isser n^4
Um den Weg VON nach BIS rauszukriegen fragst Du in der Matrix nach und krigst entweder gleich die Route(wenn ÜBER leer) oder den ersten Zwischenstop (wenn ÜBER nicht leer) in dem Fall must du wieder in die Matrix gucken, aber diesmal mir ÜBER als VON usw.

Ich hoffe, das war jetzt nicht allzu kryptisch

p.s. wenn am schluss noch irgendwo ein unendlich steht, dann gibt es für dieses Schiff keinen Weg (zu kleiner Benzintank)

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 23, 2005 15:35 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Kannst du das nochmal in Deutsch schreiben? :roll:

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Nov 23, 2005 15:48 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Ja aber erst heute abend ..... also nach 21:00 Uhr, weil ich bin heute mit InsBettBringen dran (Freu!)

VIELLEICHT wird ja auch ein Wiki Artikel draus

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 37 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 16 Queries | GZIP : On ]