class BarabasiAlbertConnectStrategy
Attributes
average_degree[RW]
score_factor[RW]
Public Class Methods
new()
click to toggle source
# File lib/gimuby/genetic/archipelago/connect_strategy/barabasi_albert_connect_strategy.rb, line 6 def initialize @average_degree = 4.0 @score_factor = 1.0 end
Public Instance Methods
connect(archipelago)
click to toggle source
# File lib/gimuby/genetic/archipelago/connect_strategy/barabasi_albert_connect_strategy.rb, line 14 def connect(archipelago) nodes = get_nodes(archipelago) nodes.shuffle! edges_to_build_per_node = (@average_degree.to_f / 2.0).round handled_nodes = nodes.slice!(0, edges_to_build_per_node) # We make a fully connected component of those ones built = make_fully_connected(archipelago, handled_nodes) nodes.each do |node| built += connect_node(archipelago, handled_nodes, node) handled_nodes.push(node) end built end
Protected Instance Methods
connect_node(archipelago, handled_nodes, node)
click to toggle source
# File lib/gimuby/genetic/archipelago/connect_strategy/barabasi_albert_connect_strategy.rb, line 35 def connect_node(archipelago, handled_nodes, node) edges_to_build_per_node = (@average_degree.to_f / 2.0).round picked_nodes = pick_random_nodes(archipelago, handled_nodes, edges_to_build_per_node) picked_nodes.each do |picked_node| archipelago.connect(node, picked_node) end picked_nodes.length * 2 end
get_node_score(archipelago, node)
click to toggle source
# File lib/gimuby/genetic/archipelago/connect_strategy/barabasi_albert_connect_strategy.rb, line 73 def get_node_score(archipelago, node) archipelago.get_degree(node) + 1 end
get_nodes_scores(archipelago, nodes)
click to toggle source
# File lib/gimuby/genetic/archipelago/connect_strategy/barabasi_albert_connect_strategy.rb, line 67 def get_nodes_scores(archipelago, nodes) nodes.map do |node| get_node_score(archipelago, node) * @score_factor end end
pick_random_nodes(archipelago, handled_nodes, number_to_pick)
click to toggle source
# File lib/gimuby/genetic/archipelago/connect_strategy/barabasi_albert_connect_strategy.rb, line 44 def pick_random_nodes(archipelago, handled_nodes, number_to_pick) scores = get_nodes_scores(archipelago, handled_nodes) scores_sum = scores.reduce(:+) picked = [] begin min_score = rand() * scores_sum.to_f scores.each_index do |index| score = scores[index] if min_score < score #we pick this one node = handled_nodes[index] unless picked.include?(node) picked.push(node) break end else min_score -= score end end end while picked.length < number_to_pick picked end