Chiến lược / thuật toán để phân chia các nhóm công bằng dựa trên lịch sử


20

Chúng tôi là một nhóm người chơi bóng sàn với nhau một cách thường xuyên. Mỗi phiên bắt đầu với nhiệm vụ khó khăn là chia đội ...

Vậy điều gì sẽ tốt hơn một ứng dụng để chọn các đội tự động?

Vì vậy, với một lịch sử kết hợp nhóm và kết quả, và một danh sách những người xuất hiện cho phiên đặc biệt này, đâu sẽ là một chiến lược tốt để tìm ra các nhóm tối ưu? Theo tối ưu, tôi có nghĩa là các đội càng bình đẳng càng tốt.

Có ý kiến ​​gì không?

Chỉnh sửa: Để làm cho nó rõ ràng, dữ liệu mà tôi phải dựa trên lựa chọn, sẽ là một cái gì đó như thế này:

[{ 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
Bóng sàn là gì?
Năng động

1
Tôi đoán rằng bạn chỉ có điểm số nhóm, và không có điểm đóng góp cá nhân?
Gort Robot

1
@Docate: Tôi sẽ đoán đó là một tên khác của Khúc côn cầu trên sàn - khúc côn cầu được chơi trên sàn phòng tập thể dục với một quả bóng cao su nhỏ thay vì trên băng với một quả bóng (tất nhiên là không có giày trượt).
Thất vọngWithFormsDesigner

2
Bạn có thể muốn làm rõ rằng thông tin duy nhất được sử dụng trong thuật toán này là có bao nhiêu đội thắng / thua mỗi người chơi đã tham gia.
TehShrike

2
@TehShrike Đối với mỗi trận đấu được chơi, tôi có thông tin về người đã chơi trong đội nào và điểm số cuối cùng là bao nhiêu. Ví dụ. {Đội1: ["a", "b", "c"], Đội2: ["d", "e", "f"], Điểm: "10-5"}
Vegar

Câu trả lời:


6

Điều đầu tiên để xem xét, đây là một cái gì đó bình thường. Nó không thiết kế một hệ thống để xác định các vòng cho cúp bóng sàn thế giới. Nó dành cho các trò chơi chọn ngẫu nhiên với một nhóm người thưởng thức một trò chơi hay hơn là một chiến thắng lắt léo.

Tôi nhớ lại một cái gì đó của Google có một trình tạo tỷ lệ cược foosball. Khá nhiều công việc đã được thực hiện trên đó hơn tôi đang làm về điều này. Tìm kiếm sự điều chỉnh cho điều đó, tôi đã tìm thấy một bài viết trong SO và một máy tính True Skill được Microsoft sử dụng cho xbox .

Thực hiện một cách tiếp cận đơn giản hơn nhiều, mỗi người chơi sẽ nhận được số điểm theo tỷ lệ số điểm mà đội của họ dành cho trò chơi. Đối với Trò chơi 1, người chơi A sẽ nhận được 1,25 (10/8) trong khi người chơi D sẽ nhận được 0,8 điểm (8/10). Tìm giá trị trung bình của tất cả các số và đó là điểm của người chơi.

Đối với bộ trò chơi được mô tả, điều này cung cấp:

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

Tại thời điểm này, bạn có một vấn đề tương tự như vấn đề phân vùng với ràng buộc là mỗi đội cần cùng số lượng người chơi và các giá trị không cần chính xác (nhưng càng gần càng tốt).


Cùng số lượng người chơi hoặc gần bằng số đó nếu nó hiển thị số lượng người chơi lẻ ;-)
Vegar

Cảm ơn đã tham khảo vấn đề phân vùng ! Bạn đá, @ user40980
Eric Gopak

3

Cách tiếp cận nhanh và bẩn:

Tính số điểm cho mỗi người chơi là tổng số điểm cho phe mà người chơi được chia cho tổng số điểm trong trò chơi cho mỗi trò chơi họ tham gia. Sau đó sắp xếp người chơi theo điểm. Đặt người chơi đầu tiên vào đội A. Sau đó, cho mỗi người chơi, thêm họ vào đội có số điểm tổng hợp thấp nhất cho đến khi một nửa số người chơi ở một đội. Tất cả những người chơi còn lại đi vào đội khác.


Cách tiếp cận này có thể hoạt động, ngay cả khi sự kết hợp của mọi người là hoàn toàn mới.
Ăn chay

Làm tốt hơn trông giống như một biến thể của vấn đề ba lô . Các trọng số cũng có thể có liên quan - theo cách tôi nhớ, người chơi nặng nhất (tôi) luôn được chọn sau cùng.
Steve314

Cách tiếp cận tham lam này được biết là đưa ra một xấp xỉ 3/4 cho giải pháp tối ưu (Wikipedia)
Radek

3

Nếu bạn không muốn đi sâu vào thế giới bá đạo của các linh mục Bayes (pdf) và như vậy, một cách tiếp cận thú vị là gán tổng số đơn hàng cho tất cả người chơi (dựa trên tỷ lệ thắng / thua, điểm tích lũy, v.v.) và sau đó chia thành các đội sử dụng chức năng chẵn lẻ như sau.

Lấy danh sách người chơi đã sắp xếp (tốt nhất đến kém nhất) và tách họ thành các đội Chẵn và lẻ dựa trên số lượng 1 bit trong chỉ mục của họ (bắt đầu từ 0). Điều đó mang lại sự phân phối sau:

  • 0000 (tốt nhất) - Thậm chí
  • 0001 - lẻ
  • 0010 - lẻ
  • 0011 - Chẵn
  • 0100 - lẻ
  • 0101 - Chẵn
  • 0110 - Chẵn
  • 0111 - lẻ

... Vv

Chức năng chẵn lẻ sẽ đảm bảo số lượng người chơi bằng nhau trên mỗi đội, cho bất kỳ số lượng người chơi chẵn nào. Sau đó, nó sẽ luân phiên tạo lợi thế cho người chơi được đánh số lẻ cho đội này hoặc đội khác theo cách mà các hiệu ứng có xu hướng cân bằng theo thời gian.

Chức năng này hoạt động tốt nhất khi phân phối kỹ năng người chơi bằng phẳng. Trong thực tế, kỹ năng của người chơi có xu hướng tuân theo phân phối "tổng các giá trị ngẫu nhiên", hay còn gọi là Gaussian (mặc dù hãy cẩn thận với các ứng dụng giả định đó trong các hệ thống như TruSkill.)

Để bù đắp cho khoảng trống kỹ năng lớn, bạn có thể áp dụng hoán vị cho danh sách này. Ví dụ: để chống lại một người chơi hàng đầu rất mạnh 0000, bạn có thể trao đổi người chơi 0011 với một người chơi Odd xếp hạng thấp hơn, chẳng hạn như 0100. Đây là nơi mọi thứ trở nên lượn sóng, nhưng ít nhất nó cung cấp một điểm khởi đầu tốt mà không đòi hỏi một thước đo chính xác của kỹ năng tuyệt đối, nhưng chỉ đơn giản là một thứ tự dựa trên kỹ năng tương đối.


2

Tùy thuộc vào thời gian bạn có, bắt đầu một vài phiên đầu tiên bằng cách chọn ngẫu nhiên các đội trưởng và có một bản nháp trước mỗi trận đấu. Theo dõi mà chọn một người chơi đi. Lựa chọn trước đó được xếp hạng cao hơn:

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

Winning a game = 5 pts

Tất cả điều này sẽ phụ thuộc vào số lượng người chơi mỗi đội. Các tổng số điểm có thể cần phải được chuyển đổi sang một trung bình hàng ngày hoặc trò chơi nếu có sự khác biệt lớn trong việc tham gia. Bạn cũng có thể trao một đội cho một chiến thắng lớn hơn.

Những người chơi được chọn sớm và chơi trong một đội chiến thắng sẽ nhận được nhiều điểm mạnh nhất.

Sau đó, hãy để máy tính thực hiện việc soạn thảo (lựa chọn các đội) bằng cách cân bằng các điểm sức mạnh cho mỗi đội và đặt các đội có xếp hạng gần bằng nhau với nhau. Người chơi được chọn sớm, nhưng tiếp tục chơi trong các đội thua sẽ rơi vào bảng xếp hạng.


Câu trả lời chính xác! Điều này có thể làm việc cho nhóm trung bình, nhưng một số đội là chiến lược. Ví dụ: nếu bạn muốn toàn bộ đội của mình trở thành người bảo vệ, thì bạn sẽ có những người chơi tổng thể tệ hơn đi vào vòng cao hơn. Nhưng, tôi đoán tôi đã không yêu cầu kinh điển: P. Cảm ơn!
Động

Đó là một cách tuyệt vời để bắt đầu. Trong vài vòng đầu tiên, mọi thứ dựa trên điểm số của đội sẽ không được áp dụng riêng lẻ vì bạn sẽ có các thành viên trong đội chơi cùng nhau trong mỗi vòng.
Gort Robot

1

Giải pháp dễ nhất sẽ là cung cấp điểm / trọng lượng của kỹ năng ước tính và cố gắng cân bằng điểm số cho mỗi đội.

Từ đó, bạn có thể tạo một mạng bayesian với các giá trị này và sau đó bạn sẽ suy luận ngược dựa trên kết quả quan sát được của mỗi trận đấu trong dữ liệu lịch sử bạn có.

Về phần tôi quan tâm: Infer.NET làm cho điều này tương đối dễ hình dung và có khả năng thực hiện, và nó có thể dự đoán tỷ lệ thắng của một trận đấu đội được đưa ra. Infer.NET là thứ mà tôi thực sự bắt đầu có được gần đây.


Bạn có đủ dữ liệu để có ý nghĩa cho rằng có khả năng sẽ chỉ có một số ít các trò chơi?
Gort Robot

Tôi đã hy vọng giải quyết điều này bằng javascript hoặc ruby, nhưng infer.net dù sao cũng có vẻ thú vị.
Ăn chay

@StevenBurnap: Phụ thuộc vào mức độ tốt / chính xác của những dự đoán ban đầu của bạn đối với khả năng của người chơi - điều mà bạn sẽ phải làm cho hầu hết hoặc tất cả các hệ thống. Lợi ích của việc sử dụng mạng là bạn sẽ có thể suy ra điểm số mới cho mỗi người chơi khi thời gian tiếp tục để cải thiện giá trị đó.
Steven Evers

1

Chúng ta hãy giả sử để thảo luận, bạn có thể gán cho mỗi người chơi một giá trị nguyên và các giá trị đó cộng lại, đó là một người chơi có điểm X có giá trị như ba người chơi có điểm A, B và C, nếu A + B + C = X. Mục tiêu sau đó là tách nhóm thành hai đội để cả hai đội có giá trị tổng bằng nhau.

Đây là phiên bản tối ưu hóa của vấn đề PHẦN TÍNH nổi tiếng là NP-Complete. Do đó, vấn đề của bạn là dành cho tất cả những gì chúng tôi biết khó giải quyết. Tuy nhiên, PHẦN THAM GIA hoàn thành NP yếu và thừa nhận một số chiến lược gần đúng hợp lý.

Một ví dụ là cách tiếp cận tham lam tương tự như những gì Steven đề xuất. Đây là một tỷ lệ gần đúng 3/4, đó là nhóm mạnh hơn không bao giờ mạnh hơn khoảng 33% so với mức phân chia tối ưu.

Lưu ý rằng bạn có thể có các ràng buộc bổ sung như bạn cần ít nhất một lượng người chơi cố định cho mỗi đội. Vì vậy, nếu bạn đưa Michael Jordan vào một lớp học mẫu giáo, bạn sẽ không thể tạo ra các đội gần như công bằng có số lượng đầy đủ. Như vậy (không đổi) ràng buộc thấp hơn về kích thước đội sẽ không ảnh hưởng đến độ cứng của vấn đề tiềm ẩn nhưng nó có thể phá hủy giới hạn gần đúng hợp lệ cho vấn đề chung.


1
Bạn không thể phù hợp với rất nhiều người chơi trên sàn tập thể dục. Với 20 người chơi, giả sử bạn muốn 10 người ở một bên, chỉ có 92378 kết hợp để kiểm tra. Nhưng nó không mất nhiều người chơi trước khi số lượng kết hợp làm cho một tìm kiếm toàn diện không thực tế.
kevin cline

@kevincline: Phải. Tôi mặc nhiên cho rằng vũ phu không phải là một lựa chọn (nếu không, tại sao lại hỏi?).
Raphael

Sẽ không bao giờ có nhiều hơn sáu người trong mỗi đội. Thường xuyên hơn bốn.
Vegar

@Vegar: Vậy thì câu hỏi của bạn là làm thế nào để khai thác điểm số đội để mô hình hóa giá trị người chơi và ít hơn về thuật toán, phải không?
Raphael

1
Trừ khi bạn có thể tìm ra một cách để thực sự ghi điểm cho mọi người bằng tài năng của họ, thì độ chính xác trong thuật toán có lẽ không quan trọng. Với vấn đề trong tay, chúng tôi chỉ có điểm số của đội và một số ít thử nghiệm. Bất kỳ đánh giá người chơi sẽ là một ước tính hoang dã.
Gort Robot

0

Làm thế nào vô lý mà bạn muốn có được? Bạn luôn có thể sử dụng nhiều hồi quy tuyến tính để tạo hệ số cho mỗi người chơi dựa trên điểm số của các đội của họ trong các trò chơi trước đó. Sau đó sắp xếp danh sách và chọn.

Trên thực tế nó có lẽ sẽ không làm việc vì nó không mô hình năng động giữa các cầu thủ, nhưng nó sẽ cung cấp cho bạn một lý do để chơi xung quanh với R . (<- xem, tôi giữ nó liên quan đến lập trình)


1
Tôi đang xem xét việc tạo một ứng dụng để tránh nhiệm vụ 2 phút hai lần một tuần, buộc tôi phải dành gần như cùng thời gian ghi kết quả cho các tính toán trong tương lai. Tôi đoán là khá nực cười ...
Vegar

-1

Nếu bạn muốn thuật toán của mình hợp lý, các thuật toán đơn giản sẽ không cắt nó. Họ sẽ thường cho bạn kết quả lạ

Bạn sẽ phải đi với một cái gì đó như hệ thống ELO hoặc Trueskill (ELO không hoạt động cho các đội mà không sửa đổi, mặc dù).


1
Điều này không đúng. Phải có một thuật toán sẽ hoạt động.
Năng động
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.