(user_id, preferred_id, dispreferred_id)
それぞれの選択肢に対応するトリプレットのデータベースを保持するだけです。
編集:これで遊ぶのに少し時間がありました。以下は、何百万もの評価に対して遅く、メモリをむさぼり食いますが、アイデアを与えるかもしれません. これを行う場合は、オンデマンドではなく、おそらく crontab から非同期で実行する必要があります。
require 'set'
choices = [
[1, 4],
[1, 5],
[2, 3],
[2, 4],
[3, 1],
[4, 2],
[4, 3],
[5, 1],
[6, 7],
[8, 4],
]
dominates = Hash.new { |hash, key| hash[key] = Set.new }
choices.each do |p, d|
dominates[p].add(d)
end
prev_dominates = nil
while dominates != prev_dominates
prev_dominates = Hash.new
dominates.each { |big, smalls| prev_dominates[big] = smalls.clone }
prev_dominates.each do |big, smalls|
smalls.each do |small|
if prev_dominates.include?(small)
prev_dominates[small].each do |smaller|
if smaller != big and !prev_dominates[smaller].include?(big)
dominates[big] << smaller
end
end
end
end
end
end
top = dominates.max_by { |big, smalls| smalls.size }[0]
puts dominates.inspect
puts "BEST: #{top}"
最上位ノードは、最終的に他のほとんどのノードを支配するノードです。ただし、グラフが循環する可能性があることを考えると、別のノードがサイクルをより早く完了する場合は、サイクルをカットします。