2010-12-13 10 views
1

Ich bin ziemlich neu in Java und Jung. Ich schreibe ein Programm, wo ich Wahrscheinlichkeiten an den Kanten des Ereignisvorkommens hinzufügen muss (bedeutet Wahrscheinlichkeit des Ereignisses, dass Daten vom ersten Knoten zum anderen fließen). Ich bin ein wenig verwirrt, dass Max-Flow den Trick für mich macht oder muss ich eine andere Option verwenden oder es gibt keine Möglichkeit, es innerhalb von Jung zu machen und in diesem Fall muss ich es selbst schreiben? Jede Hilfe in dieser Hinsicht wird geschätzt.So beschriften Kanten mit Wahrscheinlichkeiten in Grafik mit Jung 2

Grüßen, waqas

Antwort

1

Wollen Sie die Kantengewichte zu setzen beabsichtigen, die Wahrscheinlichkeiten für bestimmte Ereignisse zu repräsentieren? Der Max-Flow-Algorithmus verwendet die "Kapazitäten", die Sie jeder Kante zuweisen, um den Pfad des maximalen Flusses vom Quellknoten zum Senkenknoten zu finden. Was genau versuchst du hier zu machen?

1

Ich bin nicht sehr sicher, was Ihr Ziel ist, also werde ich mein Bestes versuchen, um zu helfen.

Sie können zuerst die die Wahrscheinlichkeiten darstellen, indem Sie eine benutzerdefinierte Edge und Edge Factory-Klassen definieren. Was ich tat, war:

0 Importe:

import org.apache.commons.collections15.Factory;

1. in Ihrer benutzerdefinierten Klassen hinzufügen. Sie Rand benutzerdefinierte Klasse sein könnte so etwas wie:

public static class MyEdge { 

    private int flow; 
    private int capacity; 

    private String name; 
    private int eIndex; 

    public MyEdge(String name, int eIndex) { 
     this.name = name; 
     this.eIndex = eIndex; 
    } 

    public int getCapacity() { 
     return this.capacity; 
    } 

    public void setCapacity(int edgeCapacity) { 
     this.capacity = edgeCapacity; 
    } 

    public int getFlow() { 
     return this.flow; 
    } 

    public void setFlow(int edgeFlow) { 
     this.flow = edgeFlow; 
    } 

    public String toString() { 
     return this.name; 
    } 

}

Die benutzerdefinierte Kante Fabrik ist, was Ihre Kanten tatsächlich erzeugt jedes Mal, wenn sie auf der Leinwand grafisch zeichnen, könnte es wie folgt aussehen:

public static class MyEdgeFactory implements Factory { 

    private static int defaultFlow = 0; 
    private static int defaultCapacity = 0; 
    private int edgeCount; 

    private MyEdgeFactory() {    

    } 

    public MyEdge create() { 
     String name = "E" + edgeCount; 
     MyEdge e = new MyEdge(name, edgeCount); 
     edgeCount++; 
     e.setFlow(defaultFlow); 
     e.setCapacity(defaultCapacity); 
     return e; 
    }  

}

2. Informieren Sie Ihren Visualisierungsbetrachter, wie die Kantenbeschriftungen angezeigt werden; Sie werden dies in hinzufügen müssen, wohin Sie Ihr Diagramm und VisualizationViewer Objekt (vv) erstellen möchten:

vv.getRenderContext().setEdgeLabelTransformer(new Transformer() { 
    public String transform(MyEdge e) { 
     return (e.toString() + " " + e.getFlow() + "/" + e.getCapacity()); 
    } 
});

Jetzt jedes Mal wenn Sie einen Rand erstellen, ist es Etikett der Form sein „E0 0/0 "," E1 0/0 "und so weiter.

Ich werde bald detaillierte Tutorials und Code auf my blog veröffentlichen, so dass Sie diesen Raum sehen können, wenn Sie viel Zeit mit dem Projekt verbringen, an dem Sie gerade arbeiten.

1

Blick auf die Art und Weise Sie anrufen setEdgeLabelTransformer, müssen Sie es einen neuen Transformator() passieren, wie ich in meinem Code-Snippet getan haben 2 nummeriert.

Wenn Sie einen neuen ToStringLabeller() übergeben, weisen Sie den Viewer an, ihn mit der Methode toString() des Kantenobjekts zu beschriften. Sie müssen stattdessen einen benutzerdefinierten Transformer übergeben. Korrigieren Sie den Code so, dass er wie meiner aussieht, und Ihnen wird nichts passieren.

Verwandte Themen