Upgrade to Pro — share decks privately, control downloads, hide ads and more …

How to choose "best of the best"

How to choose "best of the best"

2019年6月29日に行われたTokyuRuby会議13でのLT発表資料です。

この勉強会が、皆が持ち寄った食事や、発表されたLTの中から"最高"のものを投票で決めることをやっているので、それにかこつけて、IRV(Instant Runoff Voting)という投票手法を紹介しました。
また、Rubyでその投票手法を実現するgem( https://github.com/highwide/irv )を実装したので、その紹介も行っています。

Takahiro Uchiyama

June 29, 2019
Tweet

More Decks by Takahiro Uchiyama

Other Decks in Technology

Transcript

  1. ΍Γ͔ͨ ౤ථ༻ࢴ ͱΜ͔ͭ<> ΧϨʔ<> ੜϋϜ<> ౤ථ༻ࢴ ͱΜ͔ͭ<> ΧϨʔ<> ੜϋϜ<> ౤ථ༻ࢴ

    ͱΜ͔ͭ<> ΧϨʔ<> ੜϋϜ<> ౤ථ༻ࢴ ͱΜ͔ͭ<> ΧϨʔ<> ੜϋϜ<> ౤ථ༻ࢴ ͱΜ͔ͭ<> ΧϨʔ<> ੜϋϜ<> ౤ථ༻ࢴ ͱΜ͔ͭ<> ΧϨʔ<> ੜϋϜ<> ౤ථ༻ࢴ ͱΜ͔ͭ<> ΧϨʔ<> ੜϋϜ<> ީิऀ͕ॻ͍ͯ͋Δ౤ ථ༻ࢴʹɺ֤ʑʹͱͬ ͯͷʮॱҐʯΛهೖ͠ ͯ౤ථ͢Δ
  2. ूܭ͢Δ ϥ΢ϯυ B C D E F G H ܭ

    ͱΜ͔ͭ        Ґථ Ґථ Ґථ ΧϨʔ       Ґථ Ґථ Ґථ ੜϋϜ     Ґථ Ґථ Ґථ
  3. ूܭ͢Δ ϥ΢ϯυ B C D E F G H ܭ

    ͱΜ͔ͭ        Ґථ Ґථ Ґථ ΧϨʔ       Ґථ Ґථ Ґථ ੜϋϜ     Ґථ Ґථ Ґථ ա൒਺ͱΕͯͳ͍
  4. ूܭ͢Δ ϥ΢ϯυ B C D E F G H ܭ

    ͱΜ͔ͭ        Ґථ Ґථ Ґථ ΧϨʔ       Ґථ Ґථ Ґථ ੜϋϜ     Ґථ Ґථ Ґථ ա൒਺ͱΕͯͳ͍ ҐථͰ͸ ࠷ԼҐܾΊΒΕͳ͍
  5. ूܭ͢Δ ϥ΢ϯυ B C D E F G H ܭ

    ͱΜ͔ͭ        Ґථ Ґථ Ґථ ΧϨʔ       Ґථ Ґථ Ґථ ੜϋϜ     Ґථ Ґථ Ґථ ա൒਺ͱΕͯͳ͍ ҐථͰ͸ ࠷ԼҐܾΊΒΕͳ͍ Ґථ͕ Ұ൪গͳ͍ΧϨʔ͕ ࠷ԼҐ
  6. ूܭ͢Δ ϥ΢ϯυ  ΧϨʔʹ౤ථ͍ͯͨ͠ॱҐ͕શͯ܁Γ্͕Δ B C D E F G

    H ܭ ͱΜ͔ͭ   
  
      Ґථ Ґථ ΧϨʔ       ੜϋϜ 
     Ґථ Ґථ
  7. ूܭ͢Δ ϥ΢ϯυ  ΧϨʔʹ౤ථ͍ͯͨ͠ॱҐ͕શͯ܁Γ্͕Δ B C D E F G

    H ܭ ͱΜ͔ͭ   
  
      Ґථ Ґථ ΧϨʔ       ੜϋϜ 
     Ґථ Ґථ ա൒਺ͱͬͨ
  8. ࢖͍ํ require 'irv' irv = Irv.new(['とんかつ', 'カレー', '生ハム']) p irv.candidates

    # => ["とんかつ", "カレー", "生ハム"] ballots = [] 7.times do ballots << irv.issue_ballot end ballots[0].fill!(['とんかつ', 'カレー']) ballots[1].fill!(['とんかつ', 'カレー']) ballots[2].fill!(['カレー', 'とんかつ', '生ハム']) ballots[3].fill!(['カレー', 'とんかつ']) ballots[4].fill!(['生ハム', 'カレー', 'とんかつ']) ballots[5].fill!(['生ハム', 'とんかつ', 'カレー']) ballots[6].fill!(['生ハム', 'とんかつ']) ballots.each { |ballot| irv.poll!(ballot) } p irv.winner # => "とんかつ"
  9. ࢖͍ํ require 'irv' irv = Irv.new(['とんかつ', 'カレー', '生ハム']) p irv.candidates

    # => ["とんかつ", "カレー", "生ハム"] HFNJOTUBMMJSWͰΠϯετʔϧ *SWOFXͷҾ਺ʹ౤ථީิΛ౉ͯ͋͛͠Δ DBOEJEBUFTͰީิऀ͕Θ͔Δ
  10. ࢖͍ํ ballots = [] 7.times do ballots << irv.issue_ballot end

    ballots[0].fill!(['とんかつ', 'カレー']) ballots[1].fill!(['とんかつ', 'カレー']) ballots[2].fill!(['カレー', 'とんかつ', '生ハム']) ballots[3].fill!(['カレー', 'とんかつ']) ballots[4].fill!(['生ハム', 'カレー', 'とんかつ']) ballots[5].fill!(['生ハム', 'とんかつ', 'カレー']) ballots[6].fill!(['生ハム', 'とんかつ']) ballots.each { |ballot| irv.poll!(ballot) } JTTVF@CBMMPUͰ౤ථ༻ࢴ CBMMPU Λൃߦ CBMMPUʹީิΛॱҐ෇͖Ͱهೖ pMM ͢Δ هೖͨ͠༻ࢴΛ౤ථ QPMM ͢Δ
  11. ్தͷථ਺΋Θ͔ΔΑ͏ʹ͠·ͨ͠ p irv.winner result = irv.result result.process.each do |round| puts

    "\n" puts "round: #{round.order}" puts "majority: #{round.majority}" unless round.majority.nil? puts "loser: #{round.loser}" unless round.loser.nil? p round.tallied_votes end _ "とんかつ" round: 1 loser: カレー [{:とんかつ=>2, :カレー=>2, :生ハム=>3}, {:とんかつ=>4, :カレー =>3, :生ハム=>0}] round: 2 majority: とんかつ [{:とんかつ=>4, :生ハム=>3}]