2015-05-12 5 views
3

Я новичок в R и имею конкретную проблему оптимизации спортивной команды в фантазии, которую я хотел бы решить. Я видел, что другие сообщения используют lpSolve для подобных проблем, но я, похоже, не склоняюсь вокруг кода. Пример таблицы данных ниже. Каждый игрок находится в команде, играет определенную роль, имеет зарплату и имеет очки очков за игру. Мне нужны ограничения, мне нужно ровно 8 игроков. Из одной команды может быть не более 3 игроков. Для каждой роли должен быть по крайней мере один игрок (из 5). А совокупная заработная плата не должна превышать 10 000 долларов США.R Team Roster Optimization w/lpSolve

Team Player Role  Avgpts Salary 
Bears A  T   22  930 
Bears B  M   19  900 
Bears C  B   30  1300 
Bears D  J   25  970 
Bears E  S   20  910 
Jets F  T   21  920 
Jets G  M   26  980 
[...] 

В R, я пишу в следующем

> obj = DF$AVGPTS 
> con = rbind(t(model.matrix(~ Role + 0, DF)), rep(1,nrow(DF)), DF$Salary) 
> dir = c(">=",">=",">=",">=",">=","==","<=") 
> rhs = c(1,1,1,1,1,8,10000) 
> result = lp("max", obj, con, dir, rhs, all.bin = TRUE) 

Этот код прекрасно работает в производстве оптимальной фантазии команды без Ограничением не более 3-х игроков может исходить от любой из команда. Вот где я застрял, и я подозреваю, что он относится к аргументу con. Любая помощь приветствуется.

ответ

2

Что делать, если вы добавили что-то похожее на то, как вы делали роли в con?

Если вы добавите t(model.matrix(~ Team + 0, DF)), у вас будут индикаторы для каждой команды в вашем ограничении. Для примера вы дали:

> con <- rbind(t(model.matrix(~ Role + 0,DF)), t(model.matrix(~ Team + 0, DF)), rep(1,nrow(DF)), DF$Salary) 
> con 
      1 2 3 4 5 6 7 
RoleB  0 0 1 0 0 0 0 
RoleJ  0 0 0 1 0 0 0 
RoleM  0 1 0 0 0 0 1 
RoleS  0 0 0 0 1 0 0 
RoleT  1 0 0 0 0 1 0 
TeamBears 1 1 1 1 1 0 0 
TeamJets 0 0 0 0 0 1 1 
      1 1 1 1 1 1 1 
      930 900 1300 970 910 920 980 

Теперь нам нужно обновить dir и rhs с учетом этого:

dir <- c(">=",">=",">=",">=",">=",rep('<=',n_teams),"<=","<=") 
rhs <- c(1,1,1,1,1,rep(3,n_teams),8,10000) 

С n_teams устанавливается соответствующим образом.

+0

Спасибо! Прекрасно работает! – altaylor1123

+0

Любая идея, как заставить игрока в составе? Я могу увидеть, как удалить их, обнуляя их в матрице модели con, но не уверен, как заставить include. – tcash21

+0

Когда я пытаюсь просмотреть 'result', я получаю' Error: status -1'. Предполагается, что «результат» должен хранить результат решателя? – Keith

 Смежные вопросы

  • Нет связанных вопросов^_^