6

저는 R에 상당히 익숙하며 Excel의 해 찾기와 관련하여 스크립트를 작성하려고합니다. 아래 데이터를 보면, 직업 유형이 A-E 인 근로자 목록이 있습니다. 각 근로자는 급여와 생산율을 가지고 있습니다. 내가 원하는 것은 누적 급여가있는 10 명의 근로자에게서 얻을 수있는 최대 생산량을 찾는 것입니다. < 100,000. 제약 조건은 정확히 10 명의 근로자가 필요하며 A-D, E에서 1, 모든 유형에서 2 가지가 필요합니다.R을 사용하여 작업에 가장 적합한 사람들을 구제/선택하는 방법 - 구속력이 있습니까?

저는 optim, IpSolve 등과 같은 방법으로 검색하고 검색했지만 제한된 지식으로는별로 운이 없었습니다.

도움 주셔서 감사합니다.

Name Pos Salary Producton 
Joe  A 12001 13.1 
Jim  A 17753 23.5 
Jill A 11447 14.8 
Brian A 11447 14.8 
Sally B 2171 1.2 
Nancy B 4537 2.1 
Francis B 2840 1.8 
Ace  B 2840 1.8 
Bill C 3818 1.6 
Ted  C 11447 0.1 
Henry C 2000 1.1 
Kyle C 3818 1.6 
Sam  D 11447 0.1 
Trevor D 2000 1.1 
John D 4317 11.7 
Jerome D 2000 1.1 
Rebecca E 3818 1.6 
Sunny E 11447 0.1 
Britt E 2000 1.1 
Sara E 4317 11.7 
+0

예, 최소 2입니다. 감사합니다! –

+0

그냥 생각해 보자. (20,10) = 184756을 선택하면이 작은 경우에 가능한 모든 조합을 테스트하는 데 오래 걸리지 않을 것이다. 물론 숙제가 아니라면 해결사를 사용해야합니다. –

+0

운 좋게도 숙제가 아니지만 전체 목록에는 300 명이 넘는 사람들이 있습니다. 나의 실수는, 나는 원래의 포스트에서 언급 했어야했다. –

답변

6

lpSolve 패키지에서 lp을 사용하면 기본 정수 프로그래밍 문제를 해결할 수 있습니다. 첫 번째 제약 조건은 각각 A, B, C, D 및 E 위치에 있으며, 6 번째는 선택할 직원 수이고 7 번째는 총 급여입니다. DF 가정하면 질문에 표시된 데이터 프레임이 시도입니다 : 생산이 질문에 철자가 잘못 혹은 그 의도

> result 
Success: the objective function is 84.7 
> DF[result$solution == 1, ] 
    Name Pos Salary Producton 
2  Jim A 17753  23.5 
3 Jill A 11447  14.8 
4 Brian A 11447  14.8 
6 Nancy B 4537  2.1 
8  Ace B 2840  1.8 
9 Bill C 3818  1.6 
12 Kyle C 3818  1.6 
14 Trevor D 2000  1.1 
15 John D 4317  11.7 
20 Sara E 4317  11.7 

하는 것으로 : 제공

library(lpSolve) 

obj <- DF$Prod 
con <- rbind(t(model.matrix(~ Pos + 0, DF)), rep(1, nrow(DF)), DF$Salary) 
dir <- c(">=", ">=", ">=", ">=", ">=", "==", "<") 
rhs <- c(2, 2, 2, 2, 1, 10, 100000) 

result <- lp("max", obj, con, dir, rhs, all.bin = TRUE) 

.

ADDED :

아이디어가 최선의 해결책이 불가능하게하지만, 다른 잠재적 인 솔루션을 배제하지 않는다 제약 추가하는 것입니다 두 번째 가장 좋은 방법에 대해서는 다음을 우리가 얻을이 경우

con2 <- rbind(con, result$solution) 
dir2 <- c(dir, "<=") 
rhs2 <- c(rhs, 9) 
result2 <- lp("max", obj, con2, dir2, rhs2, all.bin = TRUE) 

을 최고의 솔루션과 같은 최적의 목적 값을 가지는 그냥 좋은 것, 그래서 :

> result2 
Success: the objective function is 84.7 
> DF[result2$solution == 1, ] 
    Name Pos Salary Producton 
2  Jim A 17753  23.5 
3 Jill A 11447  14.8 
4 Brian A 11447  14.8 
6 Nancy B 4537  2.1 
8  Ace B 2840  1.8 
9 Bill C 3818  1.6 
12 Kyle C 3818  1.6 
15 John D 4317  11.7 
16 Jerome D 2000  1.1 
20 Sara E 4317  11.7 

하는 것도인수가 있습니다을 사용하면 여러 솔루션을 직접 생산할 수 있습니다. 그러나 도움말 파일에는 몇 가지 버그가 언급되어 있으며 위의 방법을 사용하는 것이 더 안전 할 수 있습니다.

+0

놀라운, 정말 고마워요! 케이크 위에 착빙으로, 제 2 최고의 솔루션을 얻을 수있는 방법이 있습니까? –

+0

질문 : 알고리즘 (예 : 생산/급여)을 계산합니다. 2) 필요한 모든 카테고리 (AE)에서 상위 FOM 후보를 확보하고, 나머지 슬롯을 나머지 FOM과 함께 채 웁니다. 값. 근본적으로'lpSolve'는 무엇을하고 있습니까? –

+0

@Derek, 차선책을 추가했습니다. @Carl,'lp'는 branch-and-bound 알고리즘을 사용합니다. –