Стратегія / алгоритм поділу справедливих команд на основі історії


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
Я припускаю, що у вас є лише командні бали, а індивідуальний внесок не маєте?
Gort the Robot

1
@Dynamic: Я хочу здогадатися, що це ще одна назва хокеру на підлозі - хокей грав на підлозі спортзалу з маленьким гумовим м'ячем, а не на льоду з шайбою (і без ковзанів, звичайно).
FrustratedWithFormsDesigner

2
Ви можете уточнити, що в цьому алгоритмі може використовуватися лише інформація про те, скільки команд, які виграли / програли, у кожного гравця.
TehShrike

2
@TehShrike Для кожного зіграного матчу я маю інформацію про те, хто грав у яку команду та який був кінцевий рахунок. Напр. {Team1: ["a", "b", "c"], Team2: ["d", "e", "f"], оцінка: "10-5"}
Vegar

Відповіді:


6

Перше, що слід врахувати, це щось для випадкового. Це не розробка системи для визначення раундів для кубка світу з м'яча з підлоги. Це для випадкових ігор з групою людей, які насолоджуються гарною грою, а не однобічною виграшею.

Я пригадую щось із Google, що має генератор футбольних шансів. На цьому було зроблено трохи більше роботи, ніж я роблю над цим. Шукаючи відгук про це, я знайшов статтю в SO та калькулятор True Skill, який Microsoft використовує для xbox .

Приймаючи набагато більш спрощений підхід, кожен гравець отримує бал співвідношення балів, який має їхня команда за гру. За гру 1 гравець А отримав би 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

Дякуємо за посилання на проблему з розділами ! Ви рок, @ user40980
Ерік Гопак

3

Швидкий і брудний підхід:

Обчисліть рахунок кожного гравця, який становить загальну кількість балів за ту сторону, на якій гравець був поділений на загальну кількість балів у грі за кожну гру, в якій він брав участь. Потім сортуйте гравців за очками. Розмістіть першого гравця в команді А. Потім для кожного гравця додайте їх до команди з найнижчим сукупним балом, поки половина гравців не буде в одній команді. Усі гравці, що залишилися, переходять до іншої команди.


Такий підхід може працювати, навіть якщо дане поєднання людей є абсолютно новим.
Вегар

Виконання кращого виглядає як варіант проблеми з рюкзаком . Ваги теж можуть бути доречними - те, як я його пам’ятаю, найважчого гравця (мене) завжди вибирали останнім.
Steve314

Відомо, що цей жадібний підхід дає 4/3-наближення до оптимального рішення (Вікіпедія)
Радек

3

Якщо ви не хочете копатись у невмілому світі байєсівських пріорів (pdf), і таким цікавим підходом є призначення загального замовлення для всіх гравців (на основі коефіцієнта виграшу / програшу, накопичувальних очок тощо), а потім розділити на команди, що використовують функцію паритету наступним чином.

Візьміть відсортований список гравців (найкращий до гіршого) та розділіть їх на команди Even and Odd на основі кількості 1 біта в їх індексі (починаючи з 0). Це дає такий розподіл:

  • 0000 (найкраще) - Навіть
  • 0001 - непарне
  • 0010 - непарне
  • 0011 - Навіть
  • 0100 - непарне
  • 0101 - Навіть
  • 0110 - Навіть
  • 0111 - непарне

... тощо.

Функція паритету забезпечить рівну кількість гравців у кожній команді для будь-якого парного числа гравців. Потім це чергуватиметься, надаючи перевагу гравця з непарними номерами одній команді чи іншій таким чином, щоб ефекти, як правило, врівноважувалися з часом.

Ця функція найкраще працює, коли розподіл навичок гравця є рівним. Насправді майстерність гравців має тенденцію дотримуватися розподілу "суми випадкових значень", який називається гауссовим (хоча остерігайтеся прикладних програм такого припущення в таких системах, як TruSkill.)

Щоб компенсувати великі прогалини в кваліфікації, ви можете застосувати перестановки до цього списку. Наприклад, щоб протистояти дуже сильному головному гравцю 0000, ви можете поміняти програвач 0011 на плеєр з нижчим рейтингом, як-от 0100. Тут дещо стає хвилястим, але принаймні це дає хорошу стартову точку, яка не дає вимагають точної міри абсолютної майстерності, а просто замовлення на основі відносної майстерності.


2

Залежно від того, скільки у вас часу, починайте перші кілька сеансів, випадковим чином вибираючи капітанів команди, і майте чернетку перед кожною грою. Слідкуйте за тим, який вибір гравців іде. Раніші вибори отримують більш високі оцінки:

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

Winning a game = 5 pts

Все це залежатиме від кількості гравців у команді. У загальній кількості очок , можливо , повинні бути перетворені в щоденному або грі в середнє , якщо є велика розбіжність в участі. Ви також можете нагородити команду за більший запас перемоги.

Гравці, які були відібрані достроково та грали у команді-переможниці, отримують найбільшу кількість балів.

Потім дозвольте комп’ютеру робити складання (підбір команд), балансуючи точки живлення для кожної команди та встановлюючи команди з майже рівними показниками один проти одного. Гравці, які відібрані достроково, але продовжують грати на програшних командах, потрапляють у рейтинг.


Чудова відповідь! Це може працювати для середньої команди, але деякі команди є стратегічними. Наприклад, якщо ви хочете, щоб уся команда була захисником, то у вас були б гірші загальні гравці, які пройшли у вищі раунди. Але, я думаю, я не просив канонічного: P. Спасибі!
Динамічний

Це чудовий спосіб почати. Протягом перших кількох раундів, що базується на командному заліку, нічого не застосовуватиметься індивідуально, оскільки у вас будуть члени команди, які грають разом у кожному раунді.
Гурт Робота

1

Найпростішим рішенням було б надати оцінку / вагу оцінюваного вміння та спробувати збалансувати бал для кожної команди.

Звідти ви можете вивести байєсівську мережу з цими значеннями, а потім зробите висновок на основі спостережуваного результату кожного збігу в історичних даних, які у вас є.

Як цікавий момент з мого боку: Infer.NET робить це досить легко передбачити та потенційно реалізувати, і це може передбачити шанси на виграш за збірні команди. Infer.NET - це те, що я насправді починаю вникати останнім часом.


Чи маєте ви достатньо даних, щоб бути значущими? Дайте, що, ймовірно, буде лише кілька ігор?
Gort the Robot

Я сподівався вирішити це за допомогою JavaScript або ruby, але infer.net все одно виглядає цікаво.
Вегар

@StevenBurnap: Залежить від того, наскільки хороші / точні ваші початкові здогадки щодо здатності гравця - що вам доведеться зробити для більшості або для всіх систем. Перевага використання мережі полягає в тому, що ви зможете робити нові оцінки для кожного гравця, коли буде час на покращення цього значення.
Стівен Еверс

1

Припустимо, для обговорення ви можете призначити кожному гравцеві ціле значення, і ці значення підсумовуються, тобто гравець з оцінкою X такий же цінний, як і три гравці з балами A, B і C, якщо A + B + C = X. Мета полягає в тому, щоб розділити групу на дві команди, щоб обидві команди мали приблизно однакову суму.

Це оптимізаційна версія відомої проблеми PARTITION, яка не є повною NP. Тому ваша проблема - це все, що ми знаємо важко вирішити. Однак ПАРТІЯ слабо заповнена NP і передбачає певні стратегії наближення.

Один із прикладів - жадібний підхід, подібний до того, що пропонує Стівен. Це наближення 4/3, тобто сильніша команда ніколи не на 33% сильніша за оптимальний розкол.

Зауважте, що у вас, ймовірно, є додаткові обмеження, такі як вам потрібно принаймні фіксовану кількість гравців на команду. Тож якщо ви поставите Майкла Джордана в клас дошкільнят, ви не зможете створити майже чесних команд, які мають повну кількість. Така (постійна) нижня межа розміру команди не повинна впливати на твердість основної проблеми, але це може зруйнувати межі наближення, дійсні для загальної проблеми.


1
Ви не можете помістити дуже багато гравців на тренажерному залі. Із 20 гравців, припускаючи, що ви хочете 10 на стороні, є лише 92378 комбінацій, щоб перевірити. Але це не дуже багато гравців, перш ніж кількість комбінацій робить вичерпний пошук недоцільним.
Кевін Клайн

@kevincline: Правильно. Я неявно припускав, що груба сила не є варіантом (інакше навіщо запитати?).
Рафаель

Ніколи не було б більше шести осіб у кожній команді. Частіше чотири.
Вегар

@Vegar: Тоді ваше питання полягає в тому, як використовувати результати команд для моделювання вартості гравця і менше щодо алгоритмів, правда?
Рафаель

1
Якщо ви не зможете знайти спосіб по-справжньому оцінити людей саме за їх талантом, точність в алгоритмі, мабуть, не така важлива. З проблемою, у нас є лише командна оцінка та кілька випробувань. Будь-який рейтинг гравця буде дикою оцінкою.
Gort the Robot

0

Як смішно ви хочете отримати? Ви завжди можете використовувати кілька лінійних регресій для генерування коефіцієнтів для кожного гравця, виходячи з балів їх команд у попередніх іграх. Потім сортуйте список і виберіть.

Насправді це , ймовірно , не працюватиме , тому що він не моделює динаміку між гравцями, але це дасть вам привід , щоб грати навколо з R . (<- див., я дотримувався цього програмного забезпечення)


1
Я розглядаю можливість подати заявку, щоб уникнути 2-х хвилинного завдання два рази на тиждень, змушуючи витрачати майже стільки ж часу на запис результатів для майбутніх обчислень. Настільки смішно, я здогадуюсь ...
Вегар

-1

Якщо ви хочете, щоб ваш алгоритм був розумним, прості алгоритми просто не виріжуть його. Вони часто дадуть вам дивні результати

Вам доведеться працювати з системою ELO або Trueskill (ELO не працює для команд без модифікацій).


1
Це неправда. Має бути алгоритм, який би спрацював.
Динамічний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.