Как пометить ребра вероятностями в графе с помощью Jung 2 - PullRequest
1 голос
/ 13 декабря 2010

Я довольно новичок в Java и Jung. Я пишу программу, в которой мне нужно добавить вероятности по краям возникновения события (означает вероятность того, что данные будут перетекать из первого узла в другой). Я немного сбит с толку, что Max-Flow справится со мной, или мне нужно использовать какой-то другой вариант, или нет возможности сделать это в Юнге, и в таком случае мне нужно написать это самостоятельно? Любая помощь в этом отношении будет оценена.

С уважением, Waqas

Ответы [ 3 ]

1 голос
/ 26 декабря 2010

Я не совсем уверен, какова ваша конечная цель, поэтому я сделаю все возможное, чтобы помочь.

Сначала вы можете представить вероятности, определив пользовательские классы Edge и Edge Factory. То, что я сделал, было:

0. Импорт:

import org.apache.commons.collections15.Factory;

1. Добавьте в свои собственные классы. Они могут иметь что-то вроде:

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;
    }

}

Пользовательская фабрика ребер - это то, что создает ваши ребра каждый раз, когда вы графически рисуете их на холсте, это может выглядеть так:

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. Расскажите вашему зрителю визуализации, как отображать метки ребер; вам нужно будет добавить это там, где вы создаете свой граф и объект VisualizationViewer (vv):

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

Теперь каждый раз, когда вы создаете ребро, его метка будет иметь вид "E0 0/0", "E1 0/0" и т. Д.

Я скоро опубликую подробные руководства и код на моем блоге , чтобы вы могли смотреть это место, если вы собираетесь тратить значительное время на любой проект, над которым работаете.

1 голос
/ 07 января 2011

Посмотрите, как вы звоните setEdgeLabelTransformer , вам нужно передать ему новый Transformer () , как я сделал в моем фрагменте кода с номером 2 .

Когда вы передаете новый ToStringLabeller () , вы говорите зрителю, чтобы он метил, используя метод toString () объекта ребра. Вместо этого вам нужно будет передать пользовательский Transformer, просто исправьте ваш код так, чтобы он выглядел как мой, и все будет в порядке.

1 голос
/ 23 декабря 2010

Намерены ли вы установить граничные веса для представления вероятностей определенных событий? Алгоритм Max-Flow будет использовать «емкости», которые вы назначаете каждому ребру, чтобы найти путь максимального потока от исходной вершины до вершины стока. Что именно ты здесь пытаешься сделать?

...