Strategi / algoritma untuk membagi tim yang adil berdasarkan sejarah

20

Kami adalah sekelompok orang yang bermain bola lantai bersama secara teratur. Setiap sesi dimulai dengan tugas yang menakutkan dari membagi tim ...

Jadi apa yang lebih baik daripada aplikasi untuk memilih tim secara otomatis?

Jadi, mengingat sejarah kombinasi tim dan hasil, dan daftar orang yang muncul untuk sesi khusus ini, apa strategi yang baik untuk menemukan tim yang optimal? Secara optimal, maksud saya tim sederajat mungkin.

Ada ide?

Sunting: Untuk memperjelas, data yang saya gunakan sebagai dasar pengambilan, akan menjadi seperti ini:

[{ team1: ["playerA", "playerB", "playerC"],
   team2: ["playerD", "playerE", "playerF"],
   goals_team1: 10,
   goals_team2:  8 
 },
 { team1: ["playerD", "playerB", "playerC"],
   team2: ["playerA", "playerE", "playerG"],
   goals_team1:  2,
   goals_team2:  5
 },
 { team1: ["playerD", "playerB", "playerF"],
   team2: ["playerA", "playerE", "playerC"],
   goals_team1:  4,
   goals_team2:  2
 }]
Vegan
sumber
4
Apa itu floorball?
Dinamis
1
Saya kira Anda hanya memiliki skor tim, dan tidak ada skor kontribusi individu?
Gort the Robot
1
@ Dinamik: Saya akan menebak itu adalah nama lain untuk Hoki Lantai - hoki bermain di lantai olahraga dengan bola karet kecil alih-alih di atas es dengan keping (dan tanpa sepatu roda, tentu saja).
FrustratedWithFormsDesigner
2
Anda mungkin ingin mengklarifikasi bahwa satu-satunya informasi yang akan digunakan dalam algoritma ini adalah berapa banyak tim yang menang / kalah di setiap pemain.
TehShrike
2
@TehShrike Untuk setiap pertandingan yang dimainkan, saya memiliki informasi tentang siapa yang bermain di tim apa, dan berapa skor akhirnya. Misalnya. {Team1: ["a", "b", "c"], Team2: ["d", "e", "f"], Nilai: "10-5"}
Vegar

Jawaban:

6

Hal pertama yang perlu dipertimbangkan, ini adalah untuk sesuatu yang biasa saja. Itu tidak merancang sistem untuk menentukan putaran untuk piala dunia bola lantai. Ini untuk permainan penjemputan biasa dengan sekelompok orang yang menikmati permainan yang baik daripada kemenangan yang berat sebelah.

Saya ingat sesuatu tentang Google yang memiliki generator peluang foosball. Cukup banyak pekerjaan yang dilakukan untuk itu daripada yang saya lakukan dalam hal ini. Mencari referensi untuk itu, saya menemukan sebuah artikel di SO dan kalkulator True Skill yang digunakan oleh Microsoft untuk xbox .

Mengambil pendekatan yang jauh lebih sederhana, setiap pemain mendapatkan skor rasio poin yang dimiliki tim mereka untuk pertandingan. Untuk Game 1, pemain A akan mendapatkan 1,25 (10/8) sementara pemain D akan mendapatkan 0,8 poin (8/10). Temukan rata-rata dari semua angka dan itu adalah skor pemain.

Untuk set game yang dijelaskan, ini menyediakan:

  A 1.42
  B 1.22
  C 0.72
  D 1.07
  E 1.27
  F 1.40
  G 2.50

Pada titik ini, Anda memiliki masalah yang mirip dengan masalah partisi dengan kendala bahwa setiap tim membutuhkan jumlah pemain yang sama dan nilai tidak perlu tepat (tapi sedekat mungkin).

Komunitas
sumber
Jumlah pemain yang sama, atau sedekat mungkin jika muncul jumlah ganjil pemain ;-)
Vegar
Terima kasih atas referensi untuk masalah partisi ! You rock, @ user40980
Eric Gopak
3

Pendekatan cepat dan kotor:

Hitung skor untuk setiap pemain yang merupakan total poin untuk sisi di mana pemain itu dibagi dengan total poin dalam permainan untuk setiap permainan yang mereka ikuti. Kemudian urutkan pemain berdasarkan skor. Tempatkan pemain pertama di tim A. Kemudian untuk setiap pemain, tambahkan mereka ke tim dengan skor agregat terendah hingga separuh pemain berada di satu tim. Semua pemain yang tersisa pergi ke tim lain.

Gort the Robot
sumber
Pendekatan ini mungkin berhasil, bahkan jika kombinasi orang yang diberikan benar-benar baru.
Vegar
Melakukan lebih baik terlihat seperti varian dari masalah ransel . Bobotnya mungkin relevan juga - seperti yang saya ingat, pemain terberat (saya) selalu terpilih terakhir.
Steve314
Pendekatan serakah ini dikenal memberikan pendekatan 4/3 untuk solusi optimal (Wikipedia)
Radek
3

Jika Anda tidak ingin menggali dunia Bayorian Priors (pdf) yang memabukkan dan semacamnya, pendekatan yang menarik adalah menetapkan urutan total untuk semua pemain (berdasarkan rasio menang / kalah, poin kumulatif, dll) dan kemudian bagi ke tim menggunakan fungsi paritas sebagai berikut.

Ambil daftar pemain yang disortir (terbaik ke terburuk) dan pisahkan mereka ke dalam tim Even and Odd berdasarkan jumlah 1 bit dalam indeks mereka (mulai dari 0). Itu memberikan distribusi berikut:

  • 0000 (terbaik) - Even
  • 0001 - Ganjil
  • 0010 - Ganjil
  • 0011 - Bahkan
  • 0100 - Ganjil
  • 0101 - Merata
  • 0110 - Bahkan
  • 0111 - Ganjil

... dll.

Fungsi paritas akan memastikan jumlah pemain yang sama di setiap tim, untuk jumlah pemain genap. Kemudian akan bergantian memberikan keuntungan dari pemain bernomor ganjil ke satu tim atau yang lain sedemikian rupa sehingga efeknya cenderung menyeimbangkan dari waktu ke waktu.

Fungsi ini bekerja paling baik ketika distribusi keterampilan pemain datar. Pada kenyataannya, keterampilan pemain cenderung mengikuti distribusi "penjumlahan nilai acak", alias Gaussian (walaupun waspadai aplikasi selimut dari asumsi itu dalam sistem seperti TruSkill.)

Untuk mengimbangi kesenjangan keterampilan yang besar, Anda dapat menerapkan permutasi ke daftar ini. Misalnya, untuk melawan pemain top yang sangat kuat 0000, Anda dapat menukar pemain 0011 dengan pemain Ganjil yang lebih rendah, seperti 0100. Di sinilah keadaan menjadi bergelombang, tetapi setidaknya itu memberikan titik awal yang baik yang tidak membutuhkan ukuran keterampilan absolut yang akurat, tetapi hanya pemesanan berdasarkan keterampilan relatif.

Richard Nelson
sumber
2

Tergantung pada berapa banyak waktu yang Anda miliki, mulailah beberapa sesi pertama dengan memilih kapten tim secara acak, dan miliki konsep sebelum setiap pertandingan. Melacak yang mana pemain memilih pergi. Pilihan sebelumnya mendapatkan peringkat lebih tinggi:

Round #1 = 8 pts, Round #2 = 6 pts, Round #3 = 4 pts, etc

Winning a game = 5 pts

Semua ini akan tergantung pada jumlah pemain per tim. The total poin yang mungkin perlu dikonversi ke harian atau permainan rata-rata jika ada perbedaan besar dalam partisipasi. Anda juga dapat memberikan tim untuk margin kemenangan yang lebih besar.

Pemain yang dipilih lebih awal dan bermain di tim pemenang mendapatkan poin kekuatan terbanyak.

Kemudian biarkan komputer melakukan perancangan (pemilihan tim) dengan menyeimbangkan poin daya untuk setiap tim dan menempatkan tim dengan nilai yang hampir sama terhadap satu sama lain. Pemain yang dipilih lebih awal, tetapi terus bermain di tim yang kalah akan turun di peringkat.

JeffO
sumber
Jawaban bagus! Ini dapat bekerja untuk tim rata-rata, tetapi beberapa tim strategis. Misalnya, jika Anda ingin seluruh tim menjadi pemain bertahan, maka Anda akan memiliki pemain yang lebih buruk secara keseluruhan dalam putaran yang lebih tinggi. Tapi, saya kira saya tidak meminta kanonik: P. Terima kasih!
Dinamis
Itu cara yang bagus untuk memulai. Untuk beberapa putaran pertama, apa pun berdasarkan skor tim tidak akan berlaku secara individual karena Anda akan memiliki anggota tim yang bermain bersama di setiap putaran.
Gort the Robot
1

Solusi termudah adalah memberikan nilai / bobot keterampilan yang diperkirakan dan mencoba menyeimbangkan skor untuk setiap tim.

Dari sana, Anda dapat menyemai jaringan bayesian dengan nilai-nilai ini dan kemudian Anda akan menyimpulkan mundur berdasarkan hasil yang diamati dari setiap pertandingan dalam data historis yang Anda miliki.

Sebagai bagian yang menarik bagi saya: Infer.NET membuat ini relatif mudah untuk dibayangkan dan berpotensi diimplementasikan, dan itu bisa memprediksi peluang kemenangan yang diberikan pertarungan tim. Infer.NET adalah sesuatu yang saya benar-benar mulai masuki belakangan ini.

Steven Evers
sumber
Apakah Anda memiliki data yang cukup untuk menjadi bermakna memberikan bahwa kemungkinan hanya ada segelintir game?
Gort the Robot
Saya berharap untuk menyelesaikan ini dengan javascript atau ruby, tetapi infer.net tetap terlihat menarik.
Vegar
@StevenBurnap: Tergantung pada seberapa baik / akurat tebakan awal Anda mengenai kemampuan pemain - yang harus Anda lakukan untuk sebagian besar atau semua sistem. Manfaat menggunakan jaringan adalah Anda dapat menyimpulkan skor baru untuk setiap pemain seiring berjalannya waktu untuk meningkatkan nilai itu.
Steven Evers
1

Mari kita asumsikan demi diskusi Anda dapat menetapkan nilai integer setiap pemain dan nilai-nilai itu bertambah, yaitu pemain dengan skor X sama berharganya dengan tiga pemain dengan skor A, B dan C, jika A + B + C = X. Tujuannya adalah untuk memisahkan grup menjadi dua tim sehingga kedua tim memiliki nilai penjumlahan yang sama.

Ini adalah versi optimisasi dari masalah PARTISI terkenal yang merupakan NP-complete. Karena itu, masalah Anda adalah untuk semua yang kami tahu sulit untuk dipecahkan. Namun, PARTISI lemah melengkapi NP dan mengakui beberapa strategi perkiraan yang masuk akal.

Salah satu contoh adalah pendekatan serakah yang mirip dengan apa yang diusulkan Steven. Ini adalah perkiraan 4/3, yaitu tim yang lebih kuat tidak pernah lebih dari sekitar 33% lebih kuat dari pada pembagian optimal.

Perhatikan bahwa Anda mungkin memiliki kendala tambahan seperti Anda membutuhkan setidaknya jumlah pemain tetap per tim. Jadi, jika Anda menempatkan Michael Jordan di kelas anak-anak prasekolah, Anda tidak akan dapat membuat tim yang hampir adil yang memiliki angka penuh. Batas bawah tim yang demikian (konstan) seharusnya tidak memengaruhi kekerasan masalah yang mendasarinya, tetapi hal itu dapat menghancurkan batas perkiraan yang berlaku untuk masalah umum.

Raphael
sumber
1
Anda tidak dapat memasukkan banyak pemain di lantai gym. Dengan sebanyak 20 pemain, dengan asumsi Anda ingin 10 pada satu sisi, hanya ada 92378 kombinasi untuk diperiksa. Tetapi tidak butuh banyak pemain sebelum jumlah kombinasi membuat pencarian yang lengkap menjadi tidak praktis.
kevin cline
@kevincline: Benar. Secara implisit saya berasumsi bahwa kekerasan bukan pilihan (jika tidak, mengapa bertanya?).
Raphael
Tidak akan ada lebih dari enam orang di setiap tim. Lebih sering empat.
Vegar
@Vegar: Lalu pertanyaan Anda adalah bagaimana memanfaatkan skor tim untuk memodelkan nilai pemain dan lebih sedikit tentang algoritma, bukan?
Raphael
1
Kecuali jika Anda dapat menemukan cara untuk benar-benar memberi skor kepada orang-orang dengan bakat mereka, akurasi dalam algoritme mungkin tidak terlalu penting. Dengan masalah yang ada, kami hanya memiliki skor tim dan beberapa percobaan. Peringkat pemain apa pun akan menjadi perkiraan liar.
Gort the Robot
0

Seberapa konyol yang ingin Anda dapatkan? Anda selalu dapat menggunakan regresi linier berganda untuk menghasilkan koefisien untuk setiap pemain berdasarkan skor tim mereka di pertandingan sebelumnya. Kemudian urutkan daftar dan pilih.

Pada kenyataannya itu mungkin tidak akan bekerja karena tidak model dinamis antara pemain, namun itu akan memberi Anda alasan untuk bermain-main dengan R . (<- lihat, saya menyimpannya terkait pemrograman)

GrandmasterB
sumber
1
Saya sedang mempertimbangkan membuat aplikasi untuk menghindari tugas 2 menit dua kali seminggu, memaksa saya untuk menghabiskan jumlah waktu yang hampir sama untuk merekam hasil perhitungan di masa mendatang. Kurasa sangat konyol ...
Vegar
-1

Jika Anda ingin algoritma Anda masuk akal, algoritma sederhana tidak akan memotongnya. Mereka akan sering memberi Anda hasil yang aneh

Anda harus menggunakan ELO atau sistem Trueskill (ELO tidak bekerja untuk tim tanpa modifikasi).

Catbert
sumber
1
Ini tidak benar. Harus ada algoritma yang akan bekerja.
Dinamis