Fuar ekiplerini tarihe göre bölmek için strateji / algoritma


20

Biz düzenli olarak floorball oynayan bir grup insanız. Her oturum takımları bölmenin göz korkutucu görevi ile başlar ...

Peki ekipleri otomatik olarak seçmek için bir uygulamadan daha iyi ne olabilir?

Peki, takım kombinasyonları ve sonuçları geçmişi ve bu özel oturuma katılan kişilerin bir listesi göz önüne alındığında, optimal takımları bulmak için iyi bir strateji ne olurdu? İdeal olarak, mümkün olduğunca eşit takımları kastediyorum.

Herhangi bir fikir?

Düzenleme: Açıkça söylemek gerekirse, ben toplama temel almak zorunda veri, böyle bir şey olurdu:

[{ 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
 }]

4
Florbol nedir?
Dinamik

1
Sanırım sadece takım puanınız var ve bireysel katılım puanınız yok mu?
Robot Gort

1
@Dynamic: Kat Hokeyi için başka bir isim olduğunu tahmin edeceğim - hokey, bir spor salonu zemin üzerinde buz pateni yerine küçük bir lastik topla oynandı (ve elbette paten yok).
SinirliWithFormsDesigner

2
Bu algoritmada kullanılacak tek bilginin, her bir oyuncunun kaç kazanan / kaybeden takım olduğunu açıklığa kavuşturmak isteyebilirsiniz.
TehShrike

2
@TehShrike Oynanan her maçta, hangi takımda kimin oynadığı ve son puanın ne olduğu hakkında bilgilerim var. Örneğin. {Takım1: ["a", "b", "c"], Takım2: ["d", "e", "f"], Puan: "10-5"}
Vegar

Yanıtlar:


6

Dikkate alınması gereken ilk şey, bu sıradan bir şey için bir. Dünya kupası zemin topu için mermileri belirlemek için bir sistem tasarlamıyor. Onun rahat bir kazanmak yerine iyi bir oyun keyfini bir grup insan ile gündelik pick up oyunları için.

Google'ın bir langırt oranları üreticisi olduğunu hatırlıyorum. Bunun üzerinde yaptığımdan biraz daha fazla iş yapıldı. Bunun için bir referans arıyorum , SO ve Microsoft tarafından xbox için kullanılan bir True Skill hesap makinesi bir makale buldum .

Çok daha basit bir yaklaşım benimseyen her oyuncu, takımlarının oyuna verdiği puanların oranını alır. Oyun 1 için A oyuncusu 1,25 (10/8) alırken D oyuncusu 0,8 puan alır (8/10). Tüm sayıların ortalamasını bulun ve oyuncunun puanı budur.

Açıklanan oyun seti için bu şunları sağlar:

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

Bu noktada, her takımın aynı sayıda oyuncuya ihtiyaç duyduğu ve değerlerin tam olması gerekmediği (ancak olabildiğince yakın olması) kısıtlamasıyla bölümleme sorununa benzer bir sorununuz var .


Aynı sayıda oyuncu, ya da tek sayıda oyuncu gösterirse ne kadar yakın ;-)
Vegar

Bölümleme sorununa referans için teşekkürler ! Sen rock, @ user40980
Eric Gopak

3

Hızlı ve kirli yaklaşım:

Oyuncunun bulunduğu tarafın toplam puanı olan her oyuncu için, katıldıkları her oyun için oyundaki toplam puanlara bölünen bir puan hesaplayın. Sonra oyuncuları puana göre sıralayın. İlk oyuncuyu A takımına yerleştirin. Ardından her oyuncu için, oyuncuların yarısı bir takımda olana kadar en düşük toplam puanı olan ekibe ekleyin. Kalan tüm oyuncular diğer takıma geçer.


Bu yaklaşım, verilen insan kombinasyonu tamamen yeni olsa bile işe yarayabilir.
Vegar

Daha iyi yapmak sırt çantası sorununun bir varyantı gibi görünüyor . Ağırlıklar da alakalı olabilir - hatırladığım şekilde, en ağır oyuncu (ben) her zaman en son seçildi.
Steve314

Bu açgözlü yaklaşımın en iyi çözüme 4/3 yaklaşımı sağladığı bilinmektedir (Wikipedia)
Radek

3

Bayesian önceliklerinin (pdf) baş dünyasına girmek istemiyorsanız , ilginç bir yaklaşım tüm oyunculara (kazanç / kayıp oranına, kümülatif puanlara vb. Dayalı) toplam bir sipariş atamak ve daha sonra parite fonksiyonunu aşağıdaki gibi kullanır .

Sıralı oyuncu listesini alın (en iyiden en kötüye) ve dizinlerindeki 1 bit sayısına (0'dan başlayarak) dayalı olarak Çift ve Tek takımlara ayırın. Bu, aşağıdaki dağılımı verir:

  • 0000 (en iyi) - Çift
  • 0001 - Tek
  • 0010 - Tek
  • 0011 - Çift
  • 0100 - Tek
  • 0101 - Çift
  • 0110 - Çift
  • 0111 - Tek

...vb.

Eşlik işlevi, her takımda eşit sayıda oyuncu için eşit sayıda oyuncu sağlayacaktır. Daha sonra, tek numaralı oyuncunun avantajını bir takıma veya diğer takıma, efektler zaman içinde dengelenme eğilimi gösterecek şekilde verir.

Bu işlev, en iyi oyuncu becerisinin dağılımı düz olduğunda işe yarar. Gerçekte, oyuncu becerisi, Gaussian olarak da bilinen "rastgele değerlerin toplamı" dağılımını takip etme eğilimindedir (ancak TruSkill gibi sistemlerde bu varsayımın battaniye uygulamalarına dikkat edin.)

Büyük beceri boşluklarını telafi etmek için bu listeye permütasyon uygulayabilirsiniz. Örneğin, çok güçlü bir en iyi oyuncu 0000'a karşı koymak için, 0011'i 0100 gibi daha düşük dereceli bir Odd oynatıcıyla değiştirebilirsiniz. Burası işlerin dalgalı hale geldiği yerdir, ancak en azından iyi olmayan bir başlangıç ​​noktası sağlar. mutlak becerinin doğru bir ölçüsünü gerektirir, ancak sadece göreceli beceriye dayalı bir sipariş gerektirir.


2

Ne kadar zamanınız olduğuna bağlı olarak, takım kaptanlarını rastgele seçerek ilk birkaç oturuma başlayın ve her oyundan önce bir taslak hazırlayın. Hangi oyuncunun seçildiğini takip edin. Daha önceki seçimler daha yüksek puan alır:

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

Winning a game = 5 pts

Bütün bunlar takım başına düşen oyuncu sayısına bağlı olacaktır. Toplam puan katılımıyla büyük bir tutarsızlık varsa günlük veya oyun ortalamasına dönüştürülebilir gerekebilir. Ayrıca bir takıma daha büyük bir zafer marjı verebilirsiniz.

Erken seçilen ve kazanan bir takımda oynayan oyuncular en fazla güç puanını alır.

Daha sonra her ekip için güç noktalarını dengeleyerek ve takımları birbirine karşı eşit dereceli puanlar koyarak bilgisayarın (ekip seçimi) taslağını yapmasına izin verin. Erken seçilen ancak kaybetme takımlarında oynamaya devam eden oyuncular sıralamada düşecektir.


Mükemmel cevap! Bu, ortalama ekip için işe yarayabilir, ancak bazı ekipler stratejiktir. Örneğin, tüm ekibinizin savunmacı olmasını istiyorsanız, daha yüksek rauntlara giren genel oyuncuların daha kötü olacağını görürsünüz. Ama sanırım kanonik istemedim: P. Teşekkürler!
Dinamik

Bu başlamak için harika bir yol. İlk birkaç turda, her turda birlikte oynayan takım üyeleriniz olacağından, takım puanına dayalı hiçbir şey ayrı ayrı uygulanmayacaktır.
Robotu Gort

1

En kolay çözüm, tahmini becerinin bir derecesini / ağırlığını sağlamak ve her takım için puanı dengelemeye çalışmak olacaktır.

Oradan, bu değerlerle bir bayes ağı kurabilir ve daha sonra sahip olduğunuz geçmiş verilerdeki her bir eşleşmenin gözlemlenen sonucuna dayanarak geriye doğru çıkardınız.

Benim açımdan ilgi çekici bir nokta olarak: Infer.NET bunu görmeyi ve potansiyel olarak uygulamayı nispeten kolaylaştırıyor ve takım maçları kazanma olasılığını tahmin edebilir. Infer.NET gerçekten son zamanlarda girmeye başladığım bir şey.


Anlamlı olması için yeterli verilere sahip misiniz, muhtemelen sadece bir avuç oyun olacak mı?
Robot Gort

Javascript veya ruby ​​ile bunu çözmeyi umuyordum, ama infer.net yine de ilginç görünüyor.
Vegar

@StevenBurnap: İlk tahminlerinizin oyuncu yeteneği açısından ne kadar iyi / doğru olduğuna bağlıdır - ki çoğu veya tüm sistemler için yapmanız gerekir. Ağı kullanmanın yararı, bu değeri iyileştirmek için zaman geçtikçe her oyuncu için yeni skorlar çıkarabilmenizdir.
Steven Evers

1

Tartışma uğruna, her oyuncuya bir tamsayı değeri atayabileceğinizi ve bu değerleri toplayacağınızı varsayalım, yani X puanına sahip bir oyuncu, A + B + C = ise A, B ve C puanlarına sahip üç oyuncu kadar değerlidir. X. Amaç daha sonra grubu iki takıma ayırmaktır, böylece her iki takım da eşit toplam değere sahip olur.

Bu, NP-complete olan ünlü PARTITION sorununun optimizasyon sürümüdür . Bu nedenle, sorununuzu çözmek zor bildiğimiz herkes içindir . Ancak, PARTITION zayıf NP-tamamlıdır ve bazı makul yaklaşım stratejilerini kabul eder.

Bir örnek, Steven'ın önerdiklerine benzer açgözlü bir yaklaşımdır . Bu 4 / 3'lük bir yaklaşımdır, yani daha güçlü takım hiçbir zaman en uygun bölünmeden% 33'ten daha güçlü değildir.

Muhtemelen takım başına en az sabit bir oyuncuya ihtiyaç duymanız gibi ek kısıtlamalarınız olduğunu unutmayın. Yani Michael Jordan'ı bir okul öncesi sınıfına koyarsanız, tam sayıya sahip neredeyse adil takımlar oluşturamazsınız. Takım büyüklüğünde böyle (sabit) bir alt sınır, altta yatan sorunun sertliğini etkilememelidir, ancak genel sorun için geçerli olan yaklaşık sınırları yok edebilir.


1
Spor salonuna çok fazla oyuncu sığdıramazsınız. Bir tarafta 10 istediğinizi varsayarsak, 20 oyuncuya kadar kontrol etmek için sadece 92378 kombinasyon var. Ancak, kombinasyon sayısının kapsamlı bir aramayı kullanışsız hale getirmesi çok fazla oyuncu almaz.
kevin cline

@kevincline: Doğru. Örtülü olarak kaba kuvvetin bir seçenek olmadığını varsaydım (aksi halde neden soruyorsunuz?).
Raphael

Her takımda asla altıdan fazla kişi olmazdı. Daha sık dört.
Vegar

@Vegar: O zaman sorunuz takım oyuncularının model oyuncu değerine nasıl daha fazla faydalanacağı ve algoritmalarla ilgili daha az mı?
Raphael

1
İnsanları yetenekleriyle tam olarak puanlamanın bir yolunu bulamadığınız sürece, algoritmadaki doğruluk muhtemelen o kadar önemli değildir. Elimizdeki sorunla, sadece takım skorumuz ve bir avuç denememiz var. Herhangi bir oyuncu değerlendirmesi çılgın bir tahmin olacaktır.
Robotu Gort

0

Ne kadar saçma almak istiyorsun? Önceki oyunlarda takımlarının puanlarına göre her oyuncu için katsayılar oluşturmak için her zaman çoklu doğrusal regresyon kullanabilirsiniz. Sonra listeyi sıralayın ve seçin.

Gerçekte, oyuncular arasındaki dinamiği modellemediği için muhtemelen işe yaramaz, ancak R ile oynamak için bir neden verecektir . (<- bakın, programlama ile ilgili tuttum)


1
Haftada iki kez 2 dakikalık bir görevden kaçınmak için bir uygulama yapmayı düşünüyorum, gelecekteki hesaplamalar için sonuçları kaydederken neredeyse aynı miktarda zaman harcamak zorunda kalıyorum. Sanırım çok saçma ...
Vegar

-1

Algoritmanızın makul olmasını istiyorsanız, basit algoritmalar onu kesmez. Size genellikle garip sonuçlar verecekler

ELO veya Trueskill sistemi gibi bir şeyle gitmeniz gerekecek (ELO, modifikasyonları olmayan takımlar için çalışmıyor).


1
Bu doğru değil. İşe yarayacak bir algoritma olmalı.
Dinamik
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.