Yes, getOtherNode. Someone's sleepy. Sean On Sep 30, 2013, at 5:14 AM, Beth Kar wrote: > Thank you Sean, I tried your approach and so far it works fine for me. > However, currently I only work on a relatively small network of agents (15). > However, since there is no method getOtherEdge(from) I guess you meant > getOtherNode(from), right? > > So, the code I used is: > > public Edge getEdge(Network network, Object from, Object to){ > Bag b = network.getEdgesOut(from); > > for (int i=0; i<b.size(); i++){ > > Edge e = (Edge)(b.get(i)); > > if(e.getOtherNode(from).equals(to)){ > return e; > } > > } > > return null; > } > > and then: > > if(getedge(AgentA, AgentB) == null){ > network.addEdge(AgentA, AgentB, null); > } > > Beth. > > > On Fri, 27 Sep 2013 22:09:31 -0400, Sean Luke <[log in to unmask]> wrote: > >> The implementations discussed so far have some problems. So some notes on > people's implementations. First Tony's: >> >>> public boolean areNeighbors(Network network, Object agentA, Object agentB) { >>> Bag edges = network.getEdges(agentA, null); >>> Iterator<Edge> iter = edges.iterator(); >>> while (iter.hasNext()) { >>> Edge e = iter.next(); >>> if (e.getOtherNode(agentA)==agentB) >>> return true; >>> } >>> return false; >>> } >> >> The problem with this approach is threefold. First, it searches the entire > network looking for an edge between two nodes -- this is O(E), which is > *extremely* slow, particularly when Network has an O(1) lookup for this! > Second, if agentA isn't on either end of an edge, then getOtherNode(agentA) > will return a node -- and in theory that node could be agentB. So using it > like this will have bugs. Third, using == is probably not preferable to > using .equals(...) since Network uses hash lookups (which use .equals(...) > internally). >> >> Beth's approach: >> >>> Bag edges = mynetwork.getEdges(agentA, null); >>> int length = edges.size(); >>> boolean exists = false; >>> >>> for (int node=0; node<len; node++) { >>> Edge e = (Edge)(edges.get(node)); >>> if(e.getOtherNode(agentA) == agentB) exists = true; >>> else continue; >>> } >>> >>> if (!exists) mynetwork.addEdge(agentA, agentB, null); >> >> This has the same three issues. >> >> I suggest instead doing this. Let the two objects be "from" and "to" > instead of agentA and agentB. If your graph is undirected, it doesn't > matter which is from and which is to. >> >> public Edge getEdge(Network network, Object from, Object to) >> { >> Bag b = network.getEdgesOut(from); // will never be null >> for(int i = 0; i < b.size(); i++) >> { >> Edge e = (Edge)(b.get(i)); >> if (e.getOtherEdge(from).equals(to)) >> return e; >> } >> return null; >> } >> >> If an edge exists, this method returns it, else it returns null. This > should be a gazillion times faster for large networks. >> >> I've not tested this to see if it works, but if it doesn't, it should be a > simple bugfix. If we can get some verification, I'll add a similar method > to Network proper. >> >> Sean, embarrassed that this wasn't here in the first place...