역사를 바탕으로 공정한 팀을 나누는 전략 / 알고리즘


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
플로어 볼이란?
다이내믹

1
팀 점수 만 있고 개인 기여도 점수가 없다고 가정합니다.
로봇 고트

1
@Dynamic : Floor Hockey의 또 다른 이름이라고 생각합니다. 하키는 퍽이 달린 얼음 대신에 작은 고무 공이 달린 체육관 바닥에서 뛰었습니다. 물론 스케이트는 없습니다.
FrustratedWithFormsDesigner

2
이 알고리즘에 사용되는 유일한 정보는 각 플레이어가 얼마나 많은 승 / 패 팀을 가졌는지를 명확히하고 싶을 수도 있습니다.
TehShrike

2
@TehShrike 일치하는 각 경기마다, 누가 어떤 팀에서 뛰었는지, 최종 점수는 무엇인지에 대한 정보가 있습니다. 예 : {팀 1 ​​: [ "a", "b", "c"], 팀 2 : [ "d", "e", "f"], 점수 : "10-5"}
Vegar

답변:


6

가장 먼저 고려해야 할 것은 캐주얼 한 것입니다. 월드컵 플로어 볼의 라운드를 결정하는 시스템은 설계하지 않았습니다. 일방적 인 승리보다는 좋은 게임을 즐기는 사람들과 함께하는 캐주얼 픽업 게임입니다.

나는 foosball odds generator를 가진 구글의 무언가를 회상한다. 내가하고있는 것보다 훨씬 더 많은 작업이 이루어졌습니다. 그에 대한 굴절을 찾아서 SOxboxMicrosoft에서 사용 하는 True Skill 계산기 기사를 찾았 습니다 .

훨씬 단순한 접근 방식을 사용하면 각 플레이어는 팀이 게임에서 얻은 점수 비율을 얻습니다. 게임 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

이 시점에서 각 팀에 같은 수의 플레이어가 필요하고 값이 정확하지는 않지만 가능한 한 근접해야한다는 제약 조건으로 파티션 문제 와 비슷한 문제 가 있습니다.


같은 수의 플레이어 또는 홀수의 플레이어가 표시 될 때
가장 근접한

파티션 문제 에 대한 참조 주셔서 감사합니다 ! @ user40980 님
Eric Gopak

3

빠르고 더러운 접근 방식 :

플레이어가있는 쪽의 총 점수 인 모든 플레이어의 점수를 참여한 모든 게임에 대한 게임의 총 점수로 나눈 값을 계산 한 다음 플레이어를 점수별로 정렬합니다. 첫 번째 플레이어를 A 팀에 배치하십시오. 그런 다음 각 플레이어에 대해 절반의 플레이어가 한 팀에 올 때까지 가장 낮은 집계 점수를 가진 팀에 추가하십시오. 나머지 모든 선수는 다른 팀으로갑니다.


이 방법은 주어진 사람들의 조합이 완전히 새로운 경우에도 효과가 있습니다.
Vegar

더 잘하는 것은 배낭 문제 의 변형처럼 보입니다 . 가중치도 관련이있을 수 있습니다. 내가 기억하는 방식으로 가장 무거운 플레이어 (me)가 항상 마지막으로 선택되었습니다.
Steve314

이 탐욕스러운 접근법은 최적의 솔루션
Radek

3

Bayesian priors (pdf)의 주요 세계를 파고 싶지 않다면 흥미로운 접근 방식은 모든 플레이어에게 총 주문을 할당하고 (승리 / 손실 배급, 누적 점수 등을 기준으로) 패리티 기능 을 사용하는 팀 은 다음과 같습니다.

정렬 된 플레이어 목록 (가장 좋은 것부터 최악의 것까지)을 가져 와서 인덱스의 1 비트 수 (0부터 시작)를 기준으로 팀 Even 및 Odd로 분리합니다. 그것은 다음과 같은 분포를 제공합니다.

  • 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

이 모든 것은 팀당 플레이어 수에 따라 다릅니다. 총 포인트는 참여에 큰 차이가있는 경우 매일 또는 게임 평균으로 변환 할 필요가있다. 또한 더 큰 승리 마진으로 팀을 수여 할 수도 있습니다.

일찍 선발되어 승리 한 팀에서 플레이 한 플레이어는 가장 많은 파워 포인트를 얻습니다.

그런 다음 컴퓨터가 각 팀의 파워 포인트의 균형을 잡고 서로 비슷한 등급을 가진 팀을 배치하여 제도 (팀 선택)를하도록합니다. 일찍 선발되었지만 팀을 잃는 경기를 계속하는 플레이어는 순위가 떨어집니다.


좋은 답변입니다! 이것은 평범한 팀에게는 효과가 있지만 일부 팀은 전략적입니다. 예를 들어, 팀 전체를 수비수가되게하려면 전체 플레이어가 더 높은 라운드에서 더 나 빠지게됩니다. 그러나, 나는 정식 : P를 요구하지 않았다고 생각합니다. 감사!
Dynamic

시작하기에 좋은 방법입니다. 처음 몇 라운드 동안, 팀 점수를 기반으로하는 것은 라운드마다 함께 플레이하는 팀원이 있으므로 개별적으로 적용되지 않습니다.
로봇 고트

1

가장 쉬운 해결책은 예상 기술의 등급 / 무게를 제공하고 각 팀의 점수 균형을 맞추는 것입니다.

여기에서 이러한 값으로 베이지안 네트워크를 시드 한 다음 보유한 내역 데이터에서 각 일치 항목의 관찰 결과를 기반으로 거꾸로 추론 할 수 있습니다.

내 관심의 대상으로 : Infer.NET을 사용하면 비교적 쉽게 구상하고 구현할 수 있으며 팀 매치업에서 승리 할 확률을 예측할 수 있습니다. Infer.NET은 최근에 실제로 시작된 것입니다.


의미있는 데이터가 충분하여 소수의 게임 만있을 가능성이 있습니까?
로봇 고트

자바 스크립트 또는 루비 로이 문제를 해결하고 싶었지만 infer.net은 흥미롭게 보입니다.
Vegar

@StevenBurnap : 플레이어의 능력에 대한 초기 추측이 얼마나 좋은지 / 정확한지에 달려 있습니다. 대부분 또는 모든 시스템에서해야합니다. 네트워크 사용의 이점은 시간이 지남에 따라 각 플레이어에 대해 새로운 점수를 추론하여 해당 가치를 향상시킬 수 있다는 것입니다.
Steven Evers

1

논의를 위해 각 플레이어에 정수 값을 할당 할 수 있고 그 값을 합산 할 수 있다고 가정합시다. 즉, A + B + C = X. 목표는 그룹을 두 팀으로 분리하여 두 팀의 합산 가치가 동일하도록하는 것입니다.

이 유명한의 최적화 버전입니다 PARTITION 문제 NP-완료됩니다. 따라서 귀하의 문제는 우리 가 해결하기 어려운 것으로 알고 있습니다. 그러나 PARTITION은 NP가 거의 완료되지 않았으며 합리적인 근사 전략을 인정합니다.

한 가지 예는 Steven이 제안한 것과 비슷한 탐욕스러운 접근법 입니다. 이것은 4/3 근사치입니다. 즉, 더 강한 팀은 최적의 분할보다 약 33 % 이상 강하지 않습니다.

팀당 최소한 고정 된 수의 플레이어가 필요한 등의 추가 제약 조건이있을 수 있습니다. 따라서 마이클 조던을 미취학 아동 그룹에 배치하면 전체 수를 가진 거의 공정한 팀을 만들 수 없습니다. 팀 규모에 대한 이러한 (일정한) 하한은 기본 문제의 경도에 영향을 미치지 않지만 일반적인 문제에 유효한 근사 범위를 파괴 할 수 있습니다.


1
당신은 체육관 바닥에 많은 선수를 맞출 수 없습니다. 한쪽에 10 명을 원한다고 가정하면 최대 20 명의 플레이어가 있으며 92378 조합 만 확인할 수 있습니다. 그러나 조합의 수가 철저한 검색을 실용적이게 만들려면 많은 플레이어가 필요하지 않습니다.
케빈 클라인

@kevincline : 맞습니다. 나는 무차별적인 힘이 옵션이 아니라고 암묵적으로 가정했다 (그렇지 않으면 왜 물어?).
Raphael

각 팀에는 6 명 이상이있을 수 없습니다. 더 자주 네.
Vegar

@Vegar : 그렇다면 팀 점수를 활용하여 플레이어의 가치를 모델링하고 알고리즘에 대한 정보를 줄이는 방법이 더 중요합니다.
Raphael

1
자신의 재능으로 사람들을 정확하게 평가하는 방법을 알아낼 수 없다면 알고리즘의 정확성은 그다지 중요하지 않을 것입니다. 당면한 문제로 우리는 팀 점수와 소수의 시험 만 있습니다. 모든 플레이어 등급은 대략적인 추정치입니다.
로봇 고트

0

얼마나 웃기고 싶어? 항상 여러 선형 회귀를 사용하여 이전 게임에서 팀의 점수를 기반으로 각 플레이어에 대한 계수를 생성 할 수 있습니다. 그런 다음 목록을 정렬하고 선택하십시오.

실제로는 플레이어 간의 역학을 모델링하지 않기 때문에 아마 작동하지 않지만 R 로 놀아야 할 이유가 있습니다 . (<-참조, 프로그래밍 관련 유지)


1
나는 일주일에 두 번 2 분의 작업을 피하기 위해 응용 프로그램을 만드는 것을 고려하고 있으며, 앞으로 계산을 위해 거의 같은 시간을 결과를 기록해야합니다. 정말 어리석은 것 같아요
Vegar

-1

알고리즘을 합리적으로 만들고 싶다면 간단한 알고리즘만으로는 충분하지 않습니다. 그들은 종종 당신에게 이상한 결과를 줄 것입니다

ELO 또는 Trueskill 시스템 과 같은 작업을 수행 해야 합니다 (ELO는 수정 없이는 팀에서 작동하지 않습니다).


1
사실이 아닙니다. 작동하는 알고리즘이 있어야합니다.
Dynamic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.