Как пометить ребра вероятностями в графе с помощью Jung 2
Я довольно новичок в Java и Юнг. Я пишу программу, в которой мне нужно добавить вероятности по краям возникновения события (означает вероятность того, что данные будут перетекать из первого узла в другой). Я немного сбит с толку, что Max-Flow подойдет для меня, или мне нужно использовать какой-то другой вариант, или нет возможности сделать это в Юнге, и в этом случае мне нужно написать это самостоятельно? Любая помощь в этом отношении будет оценена.
С уважением, Вакас
3 ответа
Посмотрите, как вы вызываете setEdgeLabelTransformer, вам нужно передать ему новый Transformer (), как я сделал в своем фрагменте кода под номером 2.
Когда вы передаете новый ToStringLabeller (), вы говорите зрителю, чтобы он метил, используя метод toString() объекта edge. Вместо этого вам нужно будет передать собственный Transformer, просто исправьте ваш код так, чтобы он выглядел как мой, и все будет в порядке.
Я не совсем уверен, какова ваша конечная цель, поэтому я сделаю все возможное, чтобы помочь.
Сначала вы можете представить вероятности, определив пользовательские классы Edge и Edge Factory. То, что я сделал, было:
0. Импорт:
import org.apache.commons.collections15.Factory;
1. Добавьте в свои собственные классы. Они могут иметь что-то вроде:
открытый статический класс MyEdge { приватный поток int; частная внутренняя емкость; личное строковое имя; private int eIndex; public MyEdge(строковое имя, int eIndex) { this.name = имя; this.eIndex = eIndex; } public int getCapacity() { вернуть this.capacity; } public void setCapacity(int edgeCapacity) { this.capacity = edgeCapacity; } public int getFlow() { вернуть this.flow; } public void setFlow(int edgeFlow) { this.flow = edgeFlow; } public String toString() { вернуть this.name; } }
Пользовательская фабрика ребер - это то, что фактически создает ваши ребра каждый раз, когда вы рисуете их на холсте графически, это может выглядеть так:
открытый статический класс MyEdgeFactory реализует 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 = новый MyEdge(name, edgeCount); edgeCount++; e.setFlow(defaultFlow); e.setCapacity(defaultCapacity); вернуть е; } }
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" и так далее.
Я скоро опубликую подробные руководства и код в моем блоге, чтобы вы могли посмотреть это место, если вы собираетесь тратить значительное время на любой проект, над которым вы работаете.
Намереваетесь ли вы установить граничные веса для представления вероятностей определенных событий? Алгоритм Max-Flow будет использовать "емкости", которые вы назначаете каждому ребру, чтобы найти путь максимального потока от исходной вершины до вершины стока. Что именно вы пытаетесь сделать здесь?