กลยุทธ์ / อัลกอริทึมเพื่อแบ่งทีมที่ยุติธรรมโดยอ้างอิงจากประวัติ


20

เราเป็นกลุ่มคนที่เล่นฟลอร์บอลด้วยกันเป็นประจำ ทุกเซสชั่นเริ่มต้นด้วยภารกิจที่น่ากลัวของการแบ่งทีม ...

ดังนั้นจะมีอะไรดีไปกว่าแอปพลิเคชันในการเลือกทีมโดยอัตโนมัติ

ดังนั้นด้วยประวัติของการรวมทีมและผลลัพธ์และรายชื่อของผู้คนที่ปรากฏตัวในเซสชั่นนี้สิ่งที่จะเป็นกลยุทธ์ที่ดีในการหาทีมที่ดีที่สุด? ตามความเหมาะสมฉันหมายถึงทีมงานเท่าที่จะทำได้

ความคิดใด ๆ

แก้ไข: เพื่อให้ชัดเจนข้อมูลที่ฉันต้องใช้ในการเลือกจะเป็นดังนี้:

[{ 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
floorball คืออะไร?
แบบไดนามิก

1
ฉันคิดว่าคุณมีคะแนนทีมและไม่มีคะแนนการมีส่วนร่วมใช่หรือไม่
Gort the Robot

1
@Dynamic: ฉันจะเดาว่าเป็นอีกชื่อหนึ่งของ Floor Hockey - ฮ็อกกี้เล่นบนพื้นห้องยิมที่มีลูกบอลยางเล็ก ๆ แทนที่จะอยู่บนน้ำแข็งด้วยเด็กซน (แน่นอนว่าไม่มีรองเท้าสเก็ต)
FrustratedWithFormsDesigner

2
คุณอาจต้องการชี้แจงว่าเฉพาะข้อมูลที่จะใช้ในอัลกอริทึมนี้คือจำนวนทีมที่ชนะ / แพ้ที่ผู้เล่นแต่ละคนเปิดอยู่
TehShrike

2
@TehShrike สำหรับการเล่นที่ตรงกันแต่ละครั้งฉันมีข้อมูลว่าใครเล่นในทีมใดและคะแนนสุดท้ายคืออะไร เช่น. {Team1: ["a", "b", "c"], Team2: ["d", "e", "f"], คะแนน: "10-5"}
Vegar

คำตอบ:


6

สิ่งแรกที่ต้องพิจารณานี่เป็นสิ่งที่สบาย ๆ มันไม่ได้ออกแบบระบบเพื่อกำหนดรอบสำหรับลูกบอลฟุตบอลโลก มันเป็นเกมรับแบบสบาย ๆ กับกลุ่มคนที่สนุกกับเกมที่ดีมากกว่าการชนะแบบลำเอียง

ฉันจำสิ่งที่ Google มีเครื่องมือสร้างอัตราต่อรอง foosball งานอีกเล็กน้อยที่ทำมากกว่าที่ฉันทำในนี้ กำลังมองหา refrence สำหรับการที่ผมพบว่าบทความในดังนั้นและทักษะทรูเครื่องคิดเลขที่ใช้โดยไมโครซอฟท์สำหรับ Xbox

ด้วยวิธีการที่ง่ายกว่านี้มากผู้เล่นแต่ละคนจะได้คะแนนในอัตราส่วนของคะแนนที่ทีมของพวกเขามีสำหรับเกม สำหรับเกมที่ 1 ผู้เล่น A จะได้รับ 1.25 (10/8) ในขณะที่ผู้เล่น D จะได้รับ 0.8 คะแนน (8/10) ค้นหาความหมายของตัวเลขทั้งหมดและนั่นคือคะแนนของผู้เล่น

สำหรับชุดของเกมที่อธิบายให้สิ่งนี้:

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

ณ จุดนี้คุณมีปัญหาคล้ายกับปัญหาของพาร์ติชันที่มีข้อ จำกัด ที่แต่ละทีมต้องการจำนวนผู้เล่นและค่าที่เท่ากันไม่จำเป็นต้องแน่นอน (แต่ใกล้เคียงที่สุดเท่าที่เป็นไปได้)


จำนวนผู้เล่นที่เท่ากันหรือใกล้เคียงกับที่ได้รับถ้ามันแสดงจำนวนผู้เล่นที่คี่ ;-)
Vegar

ขอบคุณสำหรับการอ้างอิงถึงปัญหาพาร์ทิชัน ! You rock, @ user40980
Eric Gopak

3

วิธีที่รวดเร็วและสกปรก:

คำนวณคะแนนสำหรับผู้เล่นทุกคนที่เป็นคะแนนรวมสำหรับฝั่งที่ผู้เล่นหารด้วยคะแนนรวมในเกมสำหรับทุกเกมที่พวกเขาเข้าร่วมแล้วเรียงลำดับผู้เล่นตามคะแนน วางผู้เล่นคนแรกในทีม A จากนั้นสำหรับผู้เล่นแต่ละคนให้เพิ่มพวกเขาลงในทีมด้วยคะแนนรวมต่ำสุดจนกระทั่งผู้เล่นครึ่งหนึ่งอยู่ในทีมเดียว ผู้เล่นที่เหลือทั้งหมดไปที่ทีมอื่น


วิธีการนี้อาจใช้งานได้แม้ว่าการรวมกันของผู้คนจะใหม่ทั้งหมด
Vegar

ทำรูปลักษณ์ที่ดีกว่าเช่นแตกต่างจากที่ปัญหาเป้ น้ำหนักอาจมีความเกี่ยวข้องเช่นกัน - วิธีที่ฉันจำได้ผู้เล่นที่มีน้ำหนักมากที่สุด (ฉัน) จะถูกเลือกเป็นอันดับสุดท้ายเสมอ
Steve314

วิธีโลภนี้เป็นที่รู้จักกันว่าจะให้การประมาณ 4/3 ถึงทางออกที่ดีที่สุด (Wikipedia)
Radek

3

หากคุณไม่ต้องการที่จะขุดลงไปในโลกของนักบวช Bayesian (pdf)และวิธีการที่น่าสนใจคือการกำหนดคำสั่งซื้อทั้งหมดให้กับผู้เล่นทุกคน (ขึ้นอยู่กับการปันส่วนชนะ / แพ้คะแนนสะสม ฯลฯ ) จากนั้นแบ่งออกเป็น ทีมที่ใช้ฟังก์ชั่นพาริตี้ดังนี้

นำรายชื่อผู้เล่นที่เรียงลำดับ (ดีที่สุดไปหาแย่ที่สุด) และแยกพวกเขาออกเป็นทีมคู่และคี่ตามจำนวน 1 บิตในดัชนีของพวกเขา (เริ่มต้นที่ 0) ที่ให้การกระจายดังต่อไปนี้:

  • 0000 (ดีที่สุด) - สม่ำเสมอ
  • 0001 - คี่
  • 0010 - คี่
  • 0011 - สม่ำเสมอ
  • 0100 - แปลก
  • 0101 - ถึงแม้
  • 0110 - สม่ำเสมอ
  • 0111 - แปลก

... ฯลฯ

ฟังก์ชั่นพาริตีจะช่วยให้มั่นใจว่าผู้เล่นแต่ละคนมีจำนวนเท่ากันสำหรับผู้เล่นทุกคน จากนั้นจะสลับการให้ข้อได้เปรียบของผู้เล่นที่มีเลขคี่ให้กับทีมใดทีมหนึ่งหรืออีกทีมหนึ่งในลักษณะที่เอฟเฟกต์มีแนวโน้มที่จะรักษาสมดุลในช่วงเวลาหนึ่ง

ฟังก์ชั่นนี้ทำงานได้ดีที่สุดเมื่อการกระจายทักษะผู้เล่นแบน ในความเป็นจริงทักษะการเล่นของผู้เล่นมีแนวโน้มที่จะเป็นไปตามการกระจาย "ผลรวมของค่าสุ่ม" หรือที่รู้จักกันในชื่อ Gaussian (แม้ว่าจะระมัดระวังการใช้งานแบบครอบคลุมของสมมติฐานในระบบเช่น TruSkill)

เพื่อชดเชยช่องว่างทักษะขนาดใหญ่คุณสามารถนำไปใช้กับรายการนี้ ตัวอย่างเช่นเพื่อตอบโต้ผู้เล่นระดับสูงที่แข็งแกร่งมาก 0000 คุณสามารถสลับผู้เล่น 0011 กับผู้เล่นอันดับต่ำกว่าเช่น 0100 นี่คือสิ่งที่ได้รับคลื่นมือ แต่อย่างน้อยก็ให้จุดเริ่มต้นที่ดีที่ไม่ได้ ต้องใช้การวัดทักษะสัมบูรณ์ที่แม่นยำ แต่เป็นการสั่งซื้อตามทักษะความสัมพันธ์


2

ขึ้นอยู่กับว่าคุณมีเวลามากแค่ไหนเริ่มต้นช่วงแรก ๆ ด้วยการสุ่มเลือกหัวหน้าทีมและร่างก่อนแต่ละเกม ติดตามการเลือกผู้เล่นที่จะไป ตัวเลือกก่อนหน้านี้จะได้รับคะแนนที่สูงขึ้น:

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

Winning a game = 5 pts

ทั้งหมดนี้จะขึ้นอยู่กับจำนวนผู้เล่นต่อทีม คะแนนรวมอาจต้องมีการแปลงเป็นเฉลี่ยรายวันหรือเกมถ้ามีความแตกต่างขนาดใหญ่ในการมีส่วนร่วม คุณอาจมอบรางวัลให้ทีมเพื่อให้ได้ชัยชนะที่มากขึ้น

ผู้เล่นที่ถูกเลือกก่อนเวลาและเล่นกับทีมที่ชนะจะได้รับคะแนนพลังมากที่สุด

จากนั้นให้คอมพิวเตอร์ทำการร่าง (เลือกทีม) โดยการปรับสมดุลคะแนนพาวเวอร์สำหรับแต่ละทีมและวางทีมที่มีอันดับใกล้เคียงกัน ผู้เล่นที่ได้รับเลือกก่อนใคร แต่ยังคงเล่นต่อในทีมที่แพ้จะเลื่อนอันดับ


คำตอบที่ดี! สิ่งนี้สามารถทำงานให้กับทีมโดยเฉลี่ย แต่บางทีมมีกลยุทธ์ ตัวอย่างเช่นถ้าคุณต้องการให้ทีมของคุณเป็นกองหลังคุณจะมีผู้เล่นโดยรวมแย่ลงในรอบที่สูงขึ้น แต่ฉันคิดว่าฉันไม่ได้ขอบัญญัติ: หน้า ขอบคุณ!
ไดนามิก

นั่นเป็นวิธีที่ดีในการเริ่มต้น สำหรับสองสามรอบแรกสิ่งใดก็ตามที่ยึดตามคะแนนของทีมจะไม่นำไปใช้แยกกันเพราะคุณจะมีสมาชิกในทีมที่เล่นด้วยกันทุกรอบ
Gort the Robot

1

วิธีแก้ปัญหาที่ง่ายที่สุดคือการให้เกรด / น้ำหนักของทักษะโดยประมาณและพยายามทำคะแนนให้สมดุลสำหรับแต่ละทีม

จากตรงนั้นคุณสามารถสร้างเครือข่ายแบบเบย์ด้วยค่าเหล่านี้จากนั้นคุณสามารถอนุมานย้อนหลังโดยดูจากผลการสังเกตของการจับคู่แต่ละครั้งในข้อมูลประวัติที่คุณมี

ในฐานะที่เป็นจุดสนใจในส่วนของฉัน: Infer.NET ทำให้สิ่งนี้ง่ายต่อการมองเห็นและอาจนำไปใช้และมันสามารถทำนายอัตราต่อรองของการชนะของการจับคู่ของทีม Infer.NET เป็นสิ่งที่ฉันเพิ่งเริ่มเข้ามาเมื่อเร็ว ๆ นี้


คุณมีข้อมูลมากพอที่จะให้ความหมายหรือไม่ว่าจะมีเพียงไม่กี่เกม
Gort the Robot

ฉันหวังว่าจะแก้ปัญหานี้ด้วย javascript หรือ ruby ​​แต่ infer.net ก็ดูน่าสนใจอยู่ดี
Vegar

@StevenBurnap: ขึ้นอยู่กับความสามารถในการคาดเดาเริ่มต้นของคุณที่ดี / ถูกต้องเกี่ยวกับความสามารถของผู้เล่น - ซึ่งคุณจะต้องทำเพื่อระบบส่วนใหญ่หรือทั้งหมด ประโยชน์ของการใช้เครือข่ายคือคุณจะสามารถสรุปคะแนนใหม่สำหรับผู้เล่นแต่ละคนเมื่อเวลาผ่านไปเพื่อปรับปรุงค่าดังกล่าว
Steven Evers

1

ให้เราสมมติเพื่อการอภิปรายคุณสามารถกำหนดค่าจำนวนเต็มของผู้เล่นแต่ละคนและค่าเหล่านั้นเพิ่มขึ้นนั่นคือผู้เล่นที่มีคะแนน X มีค่าเท่ากับผู้เล่นสามคนที่มีคะแนน A, B และ C ถ้า A + B + C = X. เป้าหมายคือการแยกกลุ่มออกเป็นสองทีมเพื่อให้ทั้งสองทีมมีมูลค่ารวมเท่ากัน

นี่เป็นเวอร์ชันการปรับให้เหมาะสมของปัญหาพาร์ทิชันที่มีชื่อเสียงซึ่งเป็นปัญหาที่สมบูรณ์ ดังนั้นปัญหาของคุณคือสำหรับทุกสิ่งที่เรารู้วิธีแก้ปัญหา อย่างไรก็ตาม PARTITION นั้นเป็นNP-complete ที่อ่อนแอและยอมรับกลยุทธ์การประมาณที่เหมาะสม

ตัวอย่างหนึ่งคือแนวทางที่โลภคล้ายกับสิ่งที่สตีเวนเสนอ นี่คือการประมาณ 4/3 นั่นคือทีมที่แข็งแกร่งจะไม่แข็งแกร่งกว่า 33% ในการแบ่งที่ดีที่สุด

โปรดทราบว่าคุณอาจมีข้อ จำกัด เพิ่มเติมเช่นคุณต้องการผู้เล่นอย่างน้อยจำนวนคงที่ต่อทีม ดังนั้นหากคุณวาง Michael Jordan ไว้ในชั้นเรียนของเด็กก่อนวัยเรียนคุณจะไม่สามารถสร้างทีมที่เกือบจะยุติธรรมซึ่งมีจำนวนเต็ม ขอบเขตที่ต่ำกว่า (คงที่) กับขนาดทีมไม่ควรส่งผลกระทบต่อความแข็งของปัญหาพื้นฐาน แต่มันอาจทำลายขอบเขตการประมาณที่ถูกต้องสำหรับปัญหาทั่วไป


1
คุณไม่สามารถใส่ผู้เล่นจำนวนมากลงบนพื้นโรงยิมได้ มีผู้เล่นมากถึง 20 คนโดยสมมติว่าคุณต้องการ 10 คนต่อด้านมีเพียง 92378 ชุดที่จะตรวจสอบ แต่มันไม่ได้ใช้ผู้เล่นจำนวนมากก่อนที่จำนวนชุดค่าผสมจะทำให้การค้นหาไม่สมบูรณ์
วินไคลน์

@kevincline: ใช่ ฉันคิดโดยปริยายว่ากำลังดุร้ายไม่ใช่ทางเลือก
Raphael

แต่ละทีมจะไม่มีคนมากกว่าหกคน บ่อยกว่าสี่
Vegar

@Vegar: ถ้าอย่างนั้นคำถามของคุณคือจะใช้ประโยชน์จากคะแนนทีมเพื่อสร้างคุณค่าให้กับผู้เล่นแบบจำลองได้อย่างไร
ราฟาเอล

1
หากคุณไม่สามารถหาวิธีที่จะให้คะแนนคนอย่างแท้จริงด้วยความสามารถของพวกเขาความแม่นยำในอัลกอริทึมอาจไม่สำคัญ ด้วยปัญหาที่เกิดขึ้นเรามีคะแนนทีมและการทดลองเพียงเล็กน้อยเท่านั้น การให้คะแนนผู้เล่นใด ๆ จะเป็นค่าประมาณที่สูง
Gort the Robot

0

คุณต้องการได้ไร้สาระมากแค่ไหน? คุณสามารถใช้การถดถอยเชิงเส้นหลายครั้งเพื่อสร้างค่าสัมประสิทธิ์สำหรับผู้เล่นแต่ละคนโดยขึ้นอยู่กับคะแนนของทีมในเกมก่อนหน้า จากนั้นเรียงลำดับรายการและเลือก

ในความเป็นจริงมันอาจจะไม่ทำงานเพราะมันไม่ได้จำลองแบบไดนามิกระหว่างผู้เล่น แต่มันจะทำให้คุณมีเหตุผลที่จะเล่นรอบกับR (<- ดูฉันเก็บมันไว้ที่เกี่ยวข้องกับการเขียนโปรแกรม)


1
ฉันกำลังพิจารณาที่จะสร้างแอปพลิเคชันเพื่อหลีกเลี่ยงงาน 2 นาทีสองครั้งต่อสัปดาห์บังคับให้ฉันใช้จ่ายผลการบันทึกเวลาเกือบเท่าเดิมสำหรับการคำนวณในอนาคต ฉันเดาดังนั้นค่อนข้างไร้สาระ ...
Vegar

-1

หากคุณต้องการอัลกอริธึมของคุณอย่างสมเหตุสมผลอัลกอริธึมง่ายๆก็จะไม่ตัดทิ้ง พวกเขามักจะให้ผลลัพธ์ที่แปลกแก่คุณ

คุณจะต้องไปกับบางสิ่งบางอย่างเช่นระบบ ELO หรือTrueskill (ELO ไม่ได้ผลสำหรับทีมที่ไม่มีการดัดแปลง)


1
สิ่งนี้ไม่เป็นความจริง จะต้องมีอัลกอริทึมที่ใช้งานได้
ไดนามิก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.