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