Module: Networkr
- Defined in:
- lib/networkr.rb,
lib/networkr/version.rb,
lib/networkr/graphs/graph.rb,
lib/networkr/graphs/digraph.rb,
lib/networkr/algorithms/prim.rb,
lib/networkr/algorithms/karger.rb,
lib/networkr/graphs/multigraph.rb,
lib/networkr/algorithms/dijkstra.rb,
lib/networkr/algorithms/kosaraju.rb
Defined Under Namespace
Classes: DiGraph, Graph, MultiGraph, Tracker
Constant Summary
collapse
- VERSION =
"0.0.2"
Class Method Summary
collapse
Class Method Details
.dijkstra(g, source_node) ⇒ Object
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
# File 'lib/networkr/algorithms/dijkstra.rb', line 11
def dijkstra(g, source_node)
nodes_processed = [source_node]
shortest_path_distances = {}
shortest_path_distances[source_node] = 0
while nodes_processed.length != g.length
shortest = nil
start_node = nil
end_node = nil
nodes_processed.each do |node|
g.children_of(node).each do |v, options|
if !nodes_processed.include?(v)
if shortest.nil? || shortest_path_distances[node] + options[:weight] < shortest
shortest = shortest_path_distances[node] + options[:weight]
start_node = node
end_node = v
end
end
end
end
nodes_processed << end_node
shortest_path_distances[end_node] = shortest
end
shortest_path_distances
end
|
.karger(g) ⇒ Object
11
12
13
14
15
16
17
18
19
20
21
|
# File 'lib/networkr/algorithms/karger.rb', line 11
def karger(g)
while g.length > 2
node1 = g.adj.keys.sample
node2 = g.children_of(node1).keys.sample
e = [node1, node2]
contract(g, node1, node2)
end
node1 = g.adj.keys[0]
node2 = g.adj.keys[1]
g.adj[node1][node2].length
end
|
.karger_repeated(g) ⇒ Object
23
24
25
26
27
28
29
30
31
32
|
# File 'lib/networkr/algorithms/karger.rb', line 23
def karger_repeated(g)
g_copy = g.deep_copy
n = g.length
mincut = n
(n ** 2 * Math.log(n)).to_i.times do
mincut = karger(g_copy) if karger(g_copy) < mincut
end
mincut
end
|
.kosaraju_num_scc(original_g, g_rev) ⇒ Numeric
Returns number of strongly connected components.
23
24
25
26
27
28
|
# File 'lib/networkr/algorithms/kosaraju.rb', line 23
def kosaraju_num_scc(original_g, g_rev)
tracker1 = Tracker.new
tracker2 = Tracker.new
tracker2 = kosaraju(original_g, g_rev, tracker1, tracker2)
num_scc(tracker2)
end
|
.kosaraju_scc_sizes(original_g, g_rev) ⇒ Array<Numeric>
Returns sizes (numbers of nodes) of strongly connected components in descending order.
13
14
15
16
17
18
|
# File 'lib/networkr/algorithms/kosaraju.rb', line 13
def kosaraju_scc_sizes(original_g, g_rev)
tracker1 = Tracker.new
tracker2 = Tracker.new
tracker2 = kosaraju(original_g, g_rev, tracker1, tracker2)
sizes(tracker2)
end
|
.prim(g, source_node) ⇒ Object
11
12
13
14
15
16
17
18
19
20
|
# File 'lib/networkr/algorithms/prim.rb', line 11
def prim(g, source_node)
nodes_spanned = [source_node]
tree_so_far = Graph.new
while nodes_spanned.length != g.length
e = min_edge(g, nodes_spanned)
tree_so_far.add_edge(e[0][0], e[0][1], weight: e[1])
nodes_spanned << e[0][1]
end
tree_so_far
end
|