AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Graphentheorie, Optimierung eines Graphen
Thema durchsuchen
Ansicht
Themen-Optionen

Graphentheorie, Optimierung eines Graphen

Ein Thema von glkgereon · begonnen am 27. Apr 2008
Antwort Antwort
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#1

Graphentheorie, Optimierung eines Graphen

  Alt 27. Apr 2008, 16:21
Hallo,

Ich habe mal ein ziemlich allgemeines Problem, losgelöst von einer bestimmten Implementierung (ok, am Ende soll es in Java implementiert werden und die Anwendung soll am Ende der Datenspeicher für eine Physikengine sein, aber das ist hier erstmal egal ).

Ich habe eine (sehr große) Menge an Objekten, welche alle eine bestimmte Position in einem dreidimensionalen Raum besitzen.
Diese wird mittels eines Vektors mit drei Fließkommawerten angegeben.
An die zu verwendende Datenstruktur habe ich folgende Ansprüche:
- effiziente Verwaltung
- keine "harten" Grenzen, also keine Einteilung à là "Alle Objekte zwischen (0,0,0) und (1,1,1) in eine Liste"

Ausserdem sind folgende Operationen nötig:

höchste Priorität:
- Alle Objekte mit Abstand < x zu einem anderen Objekt holen
- Objekt über geringe Distanz verschieben

mittlere Priorität:
- Neues Objekt an gegebener Position einfügen
- Objekt löschen

niedrigste Priorität:
- gesamte Datenstruktur speichern / laden

So, nach etwas rumprobieren mit verschiedenen Konzepten, bin ich nun auf das verfallen, was ich anfangs sofort als "zu aufwendig und zu kompliziert zu warten" verworfen hatte.

Meine Idee ist ein Graph, in dem jedes Objekt mit den x (sagen wir mal 3-5) räumlich nächstgelegensten Objekten verknüpft ist.
Diese Idee habe ich erstmal als 2D-Struktur implementiert, dann kann man sie zu Debugzwecken auch mal schön visualisieren
Das funktioniert auch zunächst erstmal ganz gut, 25 zufällige Punkte sähen dann zum Beispiel aus wie in Anhang 1.
Der Code findet sich im Anhang 2...

Nun habe ich aber folgendes Problem: Der Graph ist alles andere als optimal!
Man sehe sich nur "Root", "4" und "5" an, so ist klar, dass 4 nicht direkt mit Root verbunden sein sollte, sondern über 5.
Gibt es einen Algorithmus, der diese Fehler ausbügelt? (Am besten würde dieser direkt beim Einfügen von 5 die Verbindung zwischen 4 und Root kappen...)
Hierzu habe ich mal versucht eine Lösung zu schreiben (Siehe Code ). Die funktioniert zwar teilweise, teilweise aber auch nicht... Um genau zu sein hat sie noch ein recht seltsames Eigenleben...

Ein weiteres Problem sind die Mehrfachverknüpfungen...
Meines Erachtens macht das ganze Konzept nur Sinn, wenn es eben kein Baum ist, wie momentan, sondern ein Graph. Wie würde ich einfach und schnell Verbindungen zwischen zB 9 und 11 herstellen? (Also erkennen, dass ich hier welche herstellen sollte...)
Auch das sollte möglichst beim Einfügen passieren, und nicht große Teile des Baums durchlaufen müssen (Ich gehe davon aus, dass der Baum nachher mehrere hundert Einträge enthält.


Hat irgendwer da eine gute Idee, wie man das besser machen könnte oder sollte oder wie man die Mehrfachverknüpfungen in den Griff bekommt?
Miniaturansicht angehängter Grafiken
initial_632.jpg  
Angehängte Dateien
Dateityp: zip linkedroom_191.zip (2,8 KB, 6x aufgerufen)
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz