Java DFS не находит правильный путь во взвешенном ориентированном графеJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Java DFS не находит правильный путь во взвешенном ориентированном графе

Сообщение Anonymous »

У меня есть реализация взвешенного ориентированного графа на Java.
Моя DFS иногда не находит правильный путь при наличии нескольких маршрутов.
Вот мой код:
// Graph.java

Код: Выделить всё

package at.htl;

import java.util.ArrayList;
import java.util.List;

public class Graph {
//hinzufügen, löschen von knoten; hinzufügen mit quell, ziel, gewicht, kante; kante löschen mit quell ziel; ob ein knoten existiert; ob zwischen zwei knoten eine kante existiert; eine nachbarschaftliste ausgeben;
private List knotens = new ArrayList();

public void addKnoten(Knoten k) {
if (!existiertKnoten(k.getName())) {
knotens.add(k);
} else {
System.out.println("Knoten " + k.getName() + " existiert bereits.");
}
}

public void deleteKnoten(char name){
Knoten zuLoeschen = findKnoten(name);

if (zuLoeschen != null) {
knotens.remove(zuLoeschen);
for (Knoten k : knotens) {
k.getKanten().removeIf(kante -> kante.getZiel() == name);
}
}
}

public boolean existiertKnoten(char name) {
return findKnoten(name) != null;
}

private Knoten findKnoten(char name) {
for (Knoten k : knotens) {
if (k.getName() == name) {
return k;
}
}
return null;
}

public void addKante(char startName, char zielName, int gewicht) {
Knoten start = findKnoten(startName);
Knoten ziel = findKnoten(zielName);

if (start != null && ziel != null) {
start.addKante(new Kante(zielName, gewicht));
} else {
System.out.println("Fehler: Startknoten oder Zielknoten nicht gefunden!");
}
}

public void deleteKante(char startName, char zielName) {
Knoten start = findKnoten(startName);

if (start != null) {
start.getKanten().removeIf(kante -> kante.getZiel() == zielName);
}
}

public boolean existiertKante(char startName, char zielName) {
Knoten start = findKnoten(startName);

if (start != null) {
for (Kante kante : start.getKanten()) {
if (kante.getZiel() == zielName) {
return true;
}
}
}
return false;
}

public boolean findeWeg(char startName, char zielName) {
Knoten start = findKnoten(startName);
if (start == null) {
System.out.println("Fehler: Startknoten '" + startName + "' nicht gefunden!");
return false;
}

List besucht = new ArrayList();
System.out.println("--- Suche Weg von " + startName + " nach " + zielName + " ---");

boolean gefunden = dfsSucheZiel(start, zielName, besucht, 0);

if (!gefunden) {
System.out.println("-> Suche beendet.  Es gibt keinen Weg von " + startName + " nach " + zielName + ".");
}
System.out.println("---------------------------------------");

return gefunden;
}

private boolean dfsSucheZiel(Knoten aktuell, char zielName, List besucht, int bisherigeKosten) {

besucht.add(aktuell.getName());

if (aktuell.getName() == zielName) {
System.out.println(">>> ZIEL '" + zielName + "' ERREICHT! >> ZIEL '" + zielName + "' ERREICHT!  ");
if (k.getKanten().isEmpty()) {
System.out.print("Keine Nachbarn");
} else {
for (Kante kante : k.getKanten()) {
System.out.print("[" + kante.getZiel() + " | Gew: " + kante.getG() + "] ");
}
}
System.out.println();
}
System.out.println("---------------------------");
}
}
// Node.java

Код: Выделить всё

package at.htl;

import java.util.ArrayList;
import java.util.List;

public class Knoten {
private char name;
private List kanten;

public Knoten(char name) {
this.name = name;
this.kanten = new ArrayList();
}

public char getName() {
return name;
}

public List getKanten() {
return kanten;
}

public void addKante(Kante kante) {
this.kanten.add(kante);
}
}
// Edge.java

Код: Выделить всё

package at.htl;

public class Kante {
private char ziel;
private int g;

public Kante(char ziel, int g) {
this.ziel = ziel;
this.g = g;
}

public char getZiel() {
return ziel;
}

public int getG() {
return g;
}

}
// Main.java

Код: Выделить всё

package at.htl;

public class Main {
static void main() {

Graph testGraph = new Graph();

Knoten kA = new Knoten('A');
Knoten kB = new Knoten('B');
Knoten kC = new Knoten('C');
Knoten kD = new Knoten('D');

testGraph.addKnoten(kA);
testGraph.addKnoten(kB);
testGraph.addKnoten(kC);
testGraph.addKnoten(kD);

// start, ziel, gewicht
testGraph.addKante('A', 'B', 10);
testGraph.addKante('A', 'C', 15);
testGraph.addKante('B', 'D', 20);
testGraph.addKante('C', 'D', 5);

testGraph.printNachbarn();

testGraph.findeWegBFS('A', 'D');

//        testGraph.deleteKnoten('D');
//
//        testGraph.printNachbarn();

}
}
Например, при поиске от A до D используется путь A->B->D
вместо более короткого пути A->C->D. Почему это происходит?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»