2016-10-11 3 views
1

Я только начинаю изучать R и сталкиваюсь с чем-то, что я не уверен, как обращаться с кодом.Поиск оптимальной команды проекта с помощью R

Я создаю data.frame с пулом людей, которые доступны для назначения проекту. Для проекта требуется один BA, один PM, два SA, и еще один человек, который может быть SA или BA. У каждого человека есть рейтинг и стоимость, связанная с ними, мне нужен максимальный рейтинг, при этом стоимость ниже определенного порога.

Я не уверен, как получить выделенную часть вышеуказанного сценария. Код ниже работает, но не учитывает дополнительный BA/SA.

(Это самообучения .. не назначены домашние задания)

EDIT-Желаемая выход , где последняя строка может быть либо СА или позиции БА.

name  position rating cost BA PM SA 
Matt  SA  95 9500 0 0 1  
Aaron  BA  85 4700 1 0 0  
Stephanie SA  95 9200 0 0 1  
Molly  PM  88 5500 0 1 0  
Jake  SA  74 5300 0 0 1 

Код:

#load libraries 
library(lpSolve) 

# create data.frame 
name = c("Steve", "Jeremy", "Matt", "Aaron", "Stephanie", "Molly", "Jake", "Tony", "Jay", "Katy", "Alison") 
position = c("BA", "PM", "SA", "BA", "SA", "PM", "SA", "SA", "PM", "BA", "SA") 
rating = c(75, 90, 95, 85, 95, 88, 74, 81, 55, 65, 68) 
cost = c(5000, 8000, 9500, 4700, 9200, 5500, 5300, 7300, 3300, 4100, 4400) 
df = data.frame(name, position, rating, cost) 

# create restrictions 
num_ba = 1 
num_pm = 1 
num_sa = 2 
max_cost = 35000 

# create vectors to constrain by position 
df$BA = ifelse(df$position == "BA", 1, 0) 
df$PM = ifelse(df$position == "PM", 1, 0) 
df$SA = ifelse(df$position == "SA", 1, 0) 

# vector to optimize against 
objective = df$rating 

# constraint directions 
const_dir <- c("=", "=", "=", "<=") 

# matrix 
const_mat = matrix(c(df$BA, df$PM, df$SA, df$cost), 4, byrow=TRUE) 
const_rhs = c(num_ba, num_pm, num_sa, max_cost) 

#solve 
x = lp("max", objective, const_mat, const_dir, const_rhs, all.bin=TRUE, all.int=TRUE) 
print(df[which(x$solution==1), ]) 
+0

Это не совсем понятно, что вы хотите иметь в качестве выхода. Не могли бы вы показать, какова цель конечной цели? – gented

+0

добавленный желаемый выпуск .. желающий, что очищает мои намерения. – M3SSYM4RV1N

+1

См. Ответ Рама на http://stackoverflow.com/questions/19250787/either-or-constraints-in-lpsolveapi –

ответ

1

, если я получил вопрос правильно, это может работать:

library(lpSolve) 

# create data.frame 
name = c("Steve", "Jeremy", "Matt", "Aaron", "Stephanie", "Molly", "Jake", "Tony", "Jay", "Katy", "Alison") 
position = c("BA", "PM", "SA", "BA", "SA", "PM", "SA", "SA", "PM", "BA", "SA") 
rating = c(75, 90, 95, 85, 95, 88, 74, 81, 55, 65, 68) 
cost = c(5000, 8000, 9500, 4700, 9200, 5500, 5300, 7300, 3300, 4100, 4400) 

df = data.frame(name, position, rating, cost) 

# create restrictions 
num_pm = 1 
min_num_ba = 1 
min_num_sa = 2 
tot_saba = 4 
max_cost = 35000 

# create vectors to constrain by position 
df$PM = ifelse(df$position == "PM", 1, 0) 
df$minBA = ifelse(df$position == "BA", 1, 0) 
df$minSA = ifelse(df$position == "SA", 1, 0) 
df$SABA = ifelse(df$position %in% c("SA","BA"), 1, 0) 

# vector to optimize against 
objective = df$rating 

# constraint directions 
const_dir <- c("==", ">=", "<=", "==", "<=") 

# matrix 
const_mat = matrix(c(df$PM, df$minBA, df$minSA, df$SABA, df$cost), 5, byrow=TRUE) 
const_rhs = c(num_pm, min_num_ba,min_num_sa, tot_saba, max_cost) 

#solve 
x = lp("max", objective, const_mat, const_dir, const_rhs, all.bin=TRUE, all.int=TRUE) 
print(df[which(x$solution==1), ]) 

, что я делаю модифицирует некоторые ограничения и добавление нового: количество BA должно быть> = 1. Количество SA> = 2, и сумма BA и SA должна быть равна 4, так что вы каждый выбирает 5 человек.

Это, однако, дает другое решение, чем то, что писал в ОП:

 name position rating cost PM minBA minSA SABA 
1  Steve  BA  75 5000 0  1  0 1 
3  Matt  SA  95 9500 0  0  1 1 
4  Aaron  BA  85 4700 0  1  0 1 
5 Stephanie  SA  95 9200 0  0  1 1 
6  Molly  PM  88 5500 1  0  0 0 

Однако, суммируя оценку этого решения дает 438, в то время как результат оп является 437, так что это должно быть правильным.

HTH.

+0

ммм, теперь я вижу, что вы, вероятно, могли бы избежать нескольких противопоказаний: на самом деле вам нужно всего четыре: PM = 1, BA> = 1, SA> = 2 и BA + SA == 4. Я буду реформировать ответ позже. – lbusett

+0

Спасибо, это имеет смысл! Я также буду работать над оптимизацией ограничений в автономном режиме для практики. – M3SSYM4RV1N

+0

Рад помочь - вот улучшенная и простая версия. – lbusett

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