Необходимо получить комбинацию записей из Фрейма данных в R, которая удовлетворяет заданной c цели в R - PullRequest
0 голосов
/ 23 апреля 2020

Позвольте мне сказать, что у меня есть приведенный ниже фрейм данных в R с 500 записями игроков со следующими столбцами

  • PlayerID
  • TotalRuns
  • RunRate
  • AutionCost

Теперь из 500 игроков я хочу, чтобы мой код дал мне несколько комбинаций из 3 игроков, которые соответствовали бы следующим критериям. Что-то вроде проблемы с Moneyball.

  • Сумма стоимости аукциона всех 3-х игроков не должна превышать X
  • У них должно быть как минимум Y TotalRuns
  • Их RunRate должен быть выше, чем средняя скорость бега всех игроков.

Пожалуйста, помогите с этим. Спасибо.

Ответы [ 3 ]

1 голос
/ 23 апреля 2020

Итак, есть choose(500,3) способов выбрать 3 игроков, что составляет 20 708 500. Не исключено, что можно сгенерировать все эти комбинации combn может сделать это для вас, но я не мог быть обеспокоен, ожидая, чтобы узнать. Если вы сделаете это с идентификаторами игроков, а затем протестируете три условия, это будет одним из способов решения вашей проблемы. Альтернативой может быть метод Монте-Карло. Выберите трех игроков, которые изначально удовлетворяют вашим условиям. Произвольно выберите другого игрока, который не принадлежит к текущему трио, если он удовлетворяет условиям, сохраните комбинацию и повторите. Если вы оптимизируете (это не ясно, но ваш вопрос имеет оптимизацию в теге), то новый игрок должен создать новое трио, которое лучше предыдущего, поэтому, если он не улучшит вашу целевую функцию (что бы это ни было быть), то вы не принимаете сделку.

1 голос
/ 26 апреля 2020

Спасибо, я использовал комбинацию ответов Джона и Джеймса.

  1. Отфильтровал всех игроков, которые не удовлетворяют критериям и которые сводились только к 90+ игрокам.
  2. Затем я использовал случайным образом выбранных игроков, пока все варианты не были исчерпаны.
  3. Наконец, я рассчитал комбинированные метрики для каждого варианта (набора) игроков, чтобы получить оптимизированный набор.

Код немного запутан и не хочет публиковать его здесь.

1 голос
/ 23 апреля 2020
choose(500,3) 

Показывает, что из пула из 500 человек собрано почти 21 000 000 комбинаций из 3 игроков, что означает, что полный анализ всего пространства поиска должен быть разумно выполнимым в разумные сроки на современной машине.

Вы можете генерировать значения этих комбинаций, используя iterp c () и getnext () из пакета iterp c. Как и в

# library(iterpc) # uncomment if not loaded
I <- iterpc(5, 3)
getnext(I)

Вы также можете существенно сократить пространство поиска несколькими способами, установив первоначальные критерии фильтрации и / или выбрав первое решение (в то время как l oop с условием = критерий соответствия) , Или вы можете получить и упорядочить их все (l oop через все комбинации) или какой-нибудь промежуточный, где вы получите n решений. А предварительная обработка может помочь уменьшить пространство поиска. Например, при заказе зарплаты в порядке возрастания сначала вам будет предложено самое дешевое решение по зарплате. Упорядочение файла по убыванию покажет вам самые лучшие решения.

ПРИМЕЧАНИЕ: Хотя это работает нормально, я вижу, что iterp c теперь заменен пакетом договоренностей, где соответствующий итератор - icombination (). getnext () по-прежнему является методом доступа для последующих итераторов.

...