networkx - Find All paths in a Directed Cyclic Graph -
actually working on text based directed graph having each word node in graph , edges between 2 adjacent words in sentence of text.
i need find paths start node end node.
is there library python can me task?
i tried doing networkx, problem networkx outputs simple paths (simple paths pretty short long sentence in input , don't contain information of sentence). , need more complex paths task.
you need write algorithm dfs
(depth first search) or bfs
(breadth first search) collect paths. below example collect possible paths source
destination
written in java.
package com.nirav.modi; import java.util.arraylist; import java.util.collections; import java.util.hashmap; import java.util.iterator; import java.util.linkedhashset; import java.util.list; import java.util.map; import java.util.nosuchelementexception; import java.util.set; class graph<t> implements iterable<t> { /* * map nodes in graph sets of outgoing edges. each set of * edges represented map edges doubles. */ private final map<t, map<t, double>> graph = new hashmap<t, map<t, double>>(); /** * adds new node graph. if node exists * no-op. * * @param node * adds graph. if node null no-op. * @return true if node added, false otherwise. */ public boolean addnode(t node) { if (node == null) { throw new nullpointerexception("the input node cannot null."); } if (graph.containskey(node)) return false; graph.put(node, new hashmap<t, double>()); return true; } /** * given source , destination node add arc source * destination node. if arc exists value * updated new value. * * @param source * source node. * @param destination * destination node. * @param length * if length if * @throws nullpointerexception * if source or destination null. * @throws nosuchelementexception * if either source of destination not exists. */ public void addedge(t source, t destination, double length) { if (source == null || destination == null) { throw new nullpointerexception("source , destination, both should non-null."); } if (!graph.containskey(source) || !graph.containskey(destination)) { throw new nosuchelementexception("source , destination, both should part of graph"); } /* node added no point returning true or false */ graph.get(source).put(destination, length); } /** * removes edge graph. * * @param source * if source node. * @param destination * if destination node. * @throws nullpointerexception * if either source or destination specified null * @throws nosuchelementexception * if graph not contain either source or destination */ public void removeedge(t source, t destination) { if (source == null || destination == null) { throw new nullpointerexception("source , destination, both should non-null."); } if (!graph.containskey(source) || !graph.containskey(destination)) { throw new nosuchelementexception("source , destination, both should part of graph"); } graph.get(source).remove(destination); } /** * given node, returns edges going outward node, immutable * map. * * @param node * node edges should queried. * @return immutable view of edges leaving node. * @throws nullpointerexception * if input node null. * @throws nosuchelementexception * if node not in graph. */ public map<t, double> edgesfrom(t node) { if (node == null) { throw new nullpointerexception("the node should not null."); } map<t, double> edges = graph.get(node); if (edges == null) { throw new nosuchelementexception("source node not exist."); } return collections.unmodifiablemap(edges); } /** * returns iterator travels nodes of graph. * * @return iterator travels nodes of graph. */ @override public iterator<t> iterator() { return graph.keyset().iterator(); } } /** * given connected directed graph, find paths between 2 input * points. */ public class graphtester<t> { private final graph<t> graph; /** * takes in graph. graph should not changed client */ public graphtester(graph<t> graph) { if (graph == null) { throw new nullpointerexception("the input graph cannot null."); } this.graph = graph; } private void validate(t source, t destination) { if (source == null) { throw new nullpointerexception("the source: " + source + " cannot null."); } if (destination == null) { throw new nullpointerexception("the destination: " + destination + " cannot null."); } if (source.equals(destination)) { throw new illegalargumentexception("the source , destination: " + source + " cannot same."); } } /** * returns list of paths, path list of nodes. * * @param source * source node * @param destination * destination node * @return list of paths */ public list<list<t>> getallpaths(t source, t destination) { validate(source, destination); list<list<t>> paths = new arraylist<list<t>>(); recursive(source, destination, paths, new linkedhashset<t>()); return paths; } // far dude ignore's cycles. private void recursive(t current, t destination, list<list<t>> paths, linkedhashset<t> path) { path.add(current); if (current == destination) { paths.add(new arraylist<t>(path)); path.remove(current); return; } final set<t> edges = graph.edgesfrom(current).keyset(); (t t : edges) { if (!path.contains(t)) { recursive(t, destination, paths, path); } } path.remove(current); } public static void main(string[] args) { graph<string> graphfindallpaths = new graph<string>(); graphfindallpaths.addnode("a"); graphfindallpaths.addnode("b"); graphfindallpaths.addnode("c"); graphfindallpaths.addnode("d"); graphfindallpaths.addedge("a", "b", 10); graphfindallpaths.addedge("a", "c", 10); graphfindallpaths.addedge("b", "d", 10); graphfindallpaths.addedge("c", "d", 10); graphfindallpaths.addedge("b", "c", 10); graphfindallpaths.addedge("c", "b", 10); graphtester<string> findallpaths = new graphtester<string>(graphfindallpaths); list<list<string>> allpaths = findallpaths.getallpaths("a", "d"); system.out.println(allpaths); // assertequals(paths, findallpaths.getallpaths("a", "d")); } }
Comments
Post a Comment