Graphen abspeichern (Gewichte)

D

dudelsack

Gast
Hallo,

wie speichert man eigentlich am sinnvollsten Graphen mit Gewichten ab? Ich habe einen Graphen, in dem von bestimmten Knoten mit unterschiedlicher Gewichtung zu anderen Knoten Verbindungen bestehen.
Meine Idee war es nun, zuerst eine Arrayliste zu erstellen, dann mit einer for-Schleife diese zu durchlaufen und immer die Verbindung einzutragen und dahinter die Gewichtung.
Also beispielsweise für ArrayListe[1]:
2 1 4 2
Dies würde dann bedeuten, dass von Knoten 1 eine Verbindung zu 2 besteht mit Gewicht 1. Ebenso besteht eine Verbindung von Knoten 1 zu Knoten 4 mit Gewicht 2.
 

greatergood

Mitglied
Das klingt fast so, als ob nicht deine Knoten ("nodes").... sondern deine Verbindungen (man nennt sie normalerweise "Kanten"/"edges") gewichtet wären (man sagt auch "mit Kosten versehen wären").

Was ist nun der Fall? Sind deine Knoten oder Kanten gewichtet?
 

Sesostris

Aktives Mitglied
Die Repräsentation eines Graphen hängt stark davon ab, wie dieser Graph aussieht und was du damit vor hast. Das geht aus deiner Frage nicht wirklich hervor. Aber eine gängige Methode ist es, für Vertices und Edges eigene Klasse zu erstellen:
Java:
	class Edge {
		Vertex target;
		double weight;
		...
	}

Java:
	class Vertex {
	    List<Edge> connections;
	    ...
	}
Das hat den Vorteil, dass du deinen Edges/Vertices noch wesentlich mehr Informationen mitgeben kannst.
 
D

dudelsack

Gast
Um konkret zu werden:
Ich möchte den Dijkstras Algorithmus in Java implementieren. Zunächst sind also meine Kanten gewichtet. Knoten hatte ich vor zusätzlich noch zu initiailsieren.
 

greatergood

Mitglied
Wie weit bist du nun schon gekommen? Falls du NOCH NICHT angefangen hast, nimm dir den Tipp von Sesostris zu Herzen und implementiere alle Objekte die in einem Graphen vorkommen korrekt!

Also erstelle eine Klasse für Kanten, eine Klasse für Knoten, eine Klasse für einen Graphen vielleicht sogar.

Dann kannst du für Dijsktra auch noch eine Klasse "Heap" definieren, die eine sortierte Liste führt, mit Knoten, die noch "überarbeitet" werden müssen. Von dieser Liste greifst du dann später für Dijkstra immer das erste element aus der Liste (das ist der Knoten, mit dem nächstkleinsten Abstand), löscht es aus der Liste und rufst den Dijkstra-Algorithmus darauf rekursiv auf...

D.h. deine ArrayListe (erster Post) ist keine so gut idee, stattdessen versehe auch deien Klassen (wie oben genannt) mit Attributen wie "int id" und bei:

* Knoten: List<Integer> edgeIds // Liste der Kanten an einem Knoten
* Kanten: int sourceNode // QuellKnoten
int targetNode // Zielknoten

und google wird dir sicher auch noch Helfen zumindest mal einen Ansatz zu machen und hier zu posten!
 
D

dudelsack

Gast
Na ja, habe jetzt schon angefangen und möchte es mit der ArrayList zu Ende machen.

Kleine Zwischenfrage noch:
Wie kann man denn am einfachsten das Minimum der PriorityQueue ermitteln. Verstehe ich das richtig, dass man mit Comparator die Liste sortiert? Wie kann man einzelne Elemente der Liste ändern?
 
D

dudelsack

Gast
So sieht es gerade aus:
Java:
int[] knoten = new int[n];
PriorityQueue schlange = new PriorityQueue();
for(int i = 0; i < n; i++){
  if(i==0){
  knoten[i] = 0;
  }else{
    knoten[i] = Integer.MAX_VALUE();
  }
  schlange.add(knoten[i]);
}
[code=Java]
Nun würde ich gerne das Minimum bestimmen, was ich ja immer brauche für den Algorithmus.
 

Sesostris

Aktives Mitglied
Wie kann man denn am einfachsten das Minimum der PriorityQueue ermitteln
Eine PriorityQueue sortiert die Elemente bereits beim Einfügen, wobei das kleinste Elemente immer am Kopf der Queue steht. Das Minimum erhältst du daher über
Code:
schlange.poll()
.

Wenn du in deiner PriorityQueue nur primitive Datentypen (zB int) einfügst, wird die natürliche Ordnung (zB 1 < 2 < ...) verwendet und du musst keinen Comparator angeben. Andernfalls wird der Comparator dem Konstruktor der PriorityQueue übergeben.

Nun zu deinem Dijkstra: In der PriorityQueue sollten sich die Vertices sortiert nach ihrer Distanz (= aufsummierte Kantengewichte) befinden, denn den Vertex mit der kleisten Distanz willst du immer als Nächstes betrachten.
Aber wo speicherst du die Distanz? Und wie willst du sie einem Knoten zuordnen?

In meinem bereits vorgestellten Konzept mit Objekten für Edges/Vertices müsstest du die Klasse Vertex nur um das Attribut distance erweitern und das Interface Comparable implementieren, um die natürliche Ordnung (bezogen auf distance) zu haben:
Java:
class Vertex implements Comparable<Vertex> {
	List<Edge> connections;
	double distance;
	
	public int compareTo(Vertex other) {
		return Double.compare(distance, other.distance);
	}
}
Für Dijkstra wäre dann auch noch ein Attribut Vertex next bzw. previous sinnvoll, um sofort den kürzesten Weg zu erhalten.
 
Zuletzt bearbeitet:

XHelp

Top Contributor
Die
Code:
compareTo
wird so nicht klappen: bei Werten wie 1.0 und 1.9 wären die Elemente angeblich gleich. Man könnte hier
Code:
Math.signum
verwenden.
 

Sesostris

Aktives Mitglied
Stimmt, das habe ich eben nicht bedacht - ist korrigiert.
Code:
Double.compare
ist ebenfalls eine Möglichkeit.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Algorithmus Graphen Java Basics - Anfänger-Themen 10
M Berechnung der Reststrecke bei Graphen Java Basics - Anfänger-Themen 1
D Zusammenhängenden Graphen für Gleisnetz erstellen Java Basics - Anfänger-Themen 13
S Library fuer Graphen Java Basics - Anfänger-Themen 3
T Collections Methode (Knoten hinzufügen) für Graphen Java Basics - Anfänger-Themen 32
M Dijkstra Algorithmus in Graphen auf mehrere verschiedene Knoten anwenden lassen Java Basics - Anfänger-Themen 11
J Graphen in Java zeichnen Java Basics - Anfänger-Themen 11
L Graphen: Anzahl Knoten // Knoten in Array speichern Java Basics - Anfänger-Themen 4
U Best Practice Graphen Tiefensuche Klassifizierung von Kanten "B","C","F" Java Basics - Anfänger-Themen 2
B Java Graphen zeichnen - Brauche Hilfe Java Basics - Anfänger-Themen 9
M Ungerichtete Graphen Java Basics - Anfänger-Themen 21
M Best Practice Programmierstil Graphen-A*-Suche Java Basics - Anfänger-Themen 5
V Graphen Java Basics - Anfänger-Themen 1
F Graphen-Algorithmen Java Basics - Anfänger-Themen 1
W Funktions-Graphen "zeichnen" Java Basics - Anfänger-Themen 2
kulturfenster Graphen zeichnen Java Basics - Anfänger-Themen 5
0x7F800000 zwei adjazenzlisten für jeden knoten eines graphen sinnvoll? Java Basics - Anfänger-Themen 17
F Graphen Bibliothek Java Basics - Anfänger-Themen 38
T Graphen Java Basics - Anfänger-Themen 11
G Graphen Java Basics - Anfänger-Themen 3
M Graphen zusammenfügen Java Basics - Anfänger-Themen 2
E Zu einem Graphen die Kantenbewertung geben Java Basics - Anfänger-Themen 2
J Aus Graphen einen Spannbaum erzeugen Java Basics - Anfänger-Themen 5
M Graphen (Tiefensuche) Java Basics - Anfänger-Themen 2
D Datentypen Wie am Besten abspeichern Java Basics - Anfänger-Themen 1
T Unterschiedliche Datentypen - worin abspeichern? Java Basics - Anfänger-Themen 18
R Text in der DB abspeichern, und danach bearbeiten Java Basics - Anfänger-Themen 5
izoards Textdatei Human unreadable abspeichern Java Basics - Anfänger-Themen 17
N Variable aus anderen Variablen in statischer Klasse berechnen/abspeichern? Java Basics - Anfänger-Themen 4
P Enums in Array abspeichern Java Basics - Anfänger-Themen 4
D Collections Arrays in ArrayList abspeichern Java Basics - Anfänger-Themen 6
N Zwei Daten (Datum) miteinander vergleichen, abspeichern, laden Java Basics - Anfänger-Themen 4
S Image Datei selektieren und in Projekt Verzeichnis abspeichern/kopieren Java Basics - Anfänger-Themen 16
R Benutzereingaben als Array abspeichern nach Programmstart Java Basics - Anfänger-Themen 5
D integer negativen Wert abspeichern Java Basics - Anfänger-Themen 3
N Was passiert wenn wir Daten auf der Festplatte abspeichern wollen? bzgl. BufferStreams Java Basics - Anfänger-Themen 9
A Eingelesene Daten in Array(Liste) abspeichern? Java Basics - Anfänger-Themen 18
B Zahl in String abspeichern und später berechnen Java Basics - Anfänger-Themen 15
x-tshainge Konsoleneingabe in datei Abspeichern Java Basics - Anfänger-Themen 3
B Methoden Konsoleneingabe Abspeichern Java Basics - Anfänger-Themen 3
M Netbeans Projekt lauffähig abspeichern Java Basics - Anfänger-Themen 3
M In Netbeans Programm so abspeichern dass es funktioniert Java Basics - Anfänger-Themen 8
E Erste Schritte txt.Datei mit BufferedReader einlesen und in 2D-Array abspeichern Java Basics - Anfänger-Themen 15
D InputStream parsen und als Bilddatei abspeichern Java Basics - Anfänger-Themen 1
V Datentypen Richtiges Format abspeichern Java Basics - Anfänger-Themen 13
R Eine Arrayliste in XML abspeichern und laden können Java Basics - Anfänger-Themen 7
C Datentypen Zeile aus mehrdimensionalem Array extrahieren uns abspeichern Java Basics - Anfänger-Themen 6
I google java-diff-util - Patch abspeichern Java Basics - Anfänger-Themen 1
B Quellcode einelsen "line by line" (und abspeichern in file (txt) Java Basics - Anfänger-Themen 7
A JFreeChart als png abspeichern Java Basics - Anfänger-Themen 2
J Werte der For-Schleife in Array abspeichern Java Basics - Anfänger-Themen 1
F Textdatei einlesen in ArryList (Objekte abspeichern?) Java Basics - Anfänger-Themen 4
K Inhalt von einer csv-Datei abspeichern Java Basics - Anfänger-Themen 3
M Riesige Zahlen abspeichern Java Basics - Anfänger-Themen 3
L Logdatei durchsuchen, Suchstand abspeichern? Java Basics - Anfänger-Themen 9
L JTextField auslesen mit getText() wie abspeichern? Java Basics - Anfänger-Themen 2
L Modulo Reste abspeichern und wiedergeben ? Java Basics - Anfänger-Themen 4
HoloYoitsu Array´s in eine art Liste abspeichern? Java Basics - Anfänger-Themen 6
M Eine Klasse als .dmg (MAc) abspeichern Java Basics - Anfänger-Themen 5
S XML Datei in ArrayList abspeichern Java Basics - Anfänger-Themen 3
0 Mauskoordinaten abspeichern/aufnehmen Java Basics - Anfänger-Themen 7
algebraiker Nach letztem / Datei abspeichern Java Basics - Anfänger-Themen 5
N gerichteten Graph abspeichern Java Basics - Anfänger-Themen 2
D Objekt in Array abspeichern Java Basics - Anfänger-Themen 7
B ABspeichern eines sehr grossen negativen Werts Java Basics - Anfänger-Themen 6
J PW von Datenbank wie abspeichern? Java Basics - Anfänger-Themen 2
F verschiedene Daten abspeichern Java Basics - Anfänger-Themen 13
N Input/Output .txt-Datei einlesen, aufteilen und seperat abspeichern Java Basics - Anfänger-Themen 3
H Wie kann ich offline ein Java Programm abspeichern Java Basics - Anfänger-Themen 14
MU5T4NG JPasswordField als Hash in Datenbank abspeichern Java Basics - Anfänger-Themen 3
O Serialisierung: Object abspeichern und aufrufen Java Basics - Anfänger-Themen 6
F Zahl abspeichern Java Basics - Anfänger-Themen 4
L Datentypen Methode zum Abspeichern von Variablen mit größeren int-Werten Java Basics - Anfänger-Themen 6
S Textfragmente aus Quellcode lesen und abspeichern Java Basics - Anfänger-Themen 2
D Ein Objekt erzeugt ein anderes Objekt - Wie beide Objekte abspeichern? Java Basics - Anfänger-Themen 5
J Datensätze aus einer DB als Objekte erzeugen und in ArrayList abspeichern Java Basics - Anfänger-Themen 9
Antoras Daten in Klasse abspeichern Java Basics - Anfänger-Themen 6
J Highscore-Liste abspeichern Java Basics - Anfänger-Themen 6
S mehrere Werte zu einem Key abspeichern Java Basics - Anfänger-Themen 3
S Zyklisches abspeichern von Daten aus einr MySql Datenbank Java Basics - Anfänger-Themen 9
G Frage zum Abspeichern von Java-Klassen Java Basics - Anfänger-Themen 9
G Instanz-Rückgabewerte abspeichern Java Basics - Anfänger-Themen 2
S Werte aus Datei lesen und in Variable abspeichern Java Basics - Anfänger-Themen 4
C txt - Datei auswählen und in texarea abspeichern Java Basics - Anfänger-Themen 2
F File lesen, ändern und abspeichern! Java Basics - Anfänger-Themen 2
N Datei aus Jar Archiv abspeichern Java Basics - Anfänger-Themen 2
K Grafik abspeichern, X11 Fehlermeldung Java Basics - Anfänger-Themen 15
A Objekt in Datei abspeichern Java Basics - Anfänger-Themen 8
C SWT Button in Variable abspeichern Java Basics - Anfänger-Themen 5
saxman Unicode aus Textdatei einlesen und wieder abspeichern Java Basics - Anfänger-Themen 13
T Abspeichern einer Animation in *.bmp Java Basics - Anfänger-Themen 12
R fensterinhalt als bild und ganzen programmstatus abspeichern Java Basics - Anfänger-Themen 2
G Abspeichern von Daten in Array oder ähnlichem Java Basics - Anfänger-Themen 3
T Hashmap abspeichern und einlesen Java Basics - Anfänger-Themen 2
G Abspeichern und einlesen Java Basics - Anfänger-Themen 6
J Bild der Zwischenablage abspeichern Java Basics - Anfänger-Themen 7
S Bild vom Internet lokal abspeichern Java Basics - Anfänger-Themen 4
G intern abspeichern? Java Basics - Anfänger-Themen 4
C .tiff Dateien laden, bearbeiten(Werte einfügen),abspeichern Java Basics - Anfänger-Themen 11
K Arrays abspeichern bzw. abfragen Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben