본문 바로가기
카테고리 없음

선형계획법(LP, Linear Programming)

by stherhj 2022. 9. 20.

[문제] 어떤 작전부대의 편성을 계획하고 있다. 이때 이 작전에 효과적인 전투원은 A, B, C 세 가지 타입이 있다. 각 타입의 전투원은 작전을 수행할 때 A타입은 10포인트, B타입은 8포인트, C타입은 9포인트의 효과를 실현할 것으로 기대된다. 부대는 각 타입의 전투원을 몇 명씩 편성해야 작전 효과를 극대화할 수 있을까? 이때 훈련비용(단위: 천만원)은 각 타입 별로 단위 당 2, 3, 1이 소요되며, 합계 1,000을 초과할 수 없다. 전투 준비시간(단위: 시간)은 각각 5, 6, 6이 소요되며, 합계 2,400을 초과할 수 없다. 전투참가가능 총인원은 700명을 초과할 없다. 또한 본부에서는 특별 명령을 통하여 B타입의 전투원은 160명 이상을 편성하라고 지시하였다.

#LP(Linear Programming) 선형계획법
#install.packages("lpSolve")
library(lpSolve)
#Max. Z = 10x1 + 8x2 + 9x3 #A타입은 10포인트, B타입은 8포인트, C타입은 9포인트의 효과
z <- c(10, 8, 9)
# s.t.
# 2x1 + 3x2 + 1x3 <= 1000 #단위 당 2, 3, 1이 소요되며, 합계 1,000을 초과할 수 없다
# 5x1 + 6x2 + 6x3 <= 2400 #각각 5, 6, 6이 소요되며, 합계 2,400을 초과할 수 없다
# x1 + x2 + x3 <= 700 #총인원은 700명을 초과할 없다
# x2 >= 160 #B타입의 전투원은 160명 이상을 편성
A <- matrix(c(2,3,1,5,6,6,1,1,1,0,1,0),nrow=4,byrow=TRUE)
B <- c(1000, 24000, 700, 160)
dir <- c("<=", "<=", "<=", ">=")
opt <- lp(direction = "max", objective.in = z, const.mat = A, const.dir= dir, const.rhs = B, all.int=T)
opt$solution

참고: [R Studio] 선형계획법(lp, linear programming)과 해찾기(lpSolve) 01 : 네이버 블로그 (naver.com)

 

[25회 ADP 기출]

library(lpSolve)
#Max. Z = 31x1 + 20x2 + 31x3 + 22x4 + 43x5 
z <- c(31, 20, 31, 22, 43)
# s.t.
# 24x1 + 16x2 + 17x3 + 14x4 + 25x5 <= 50 
# 24x1 + 15x2 + 25x3 + 13x4 + 23x5 <= 60
# 13x1 + 11x2 + 12x3 + 15x4 + 15x5  <= 80
A <- matrix(c(24, 16, 17, 14, 25, 24, 15, 25, 13, 23, 13, 11, 12, 15, 15),nrow=3,byrow=TRUE)
B <- c(50, 60, 80)
dir <- c("<=", "<=", "<=")
opt <- lp(direction = "max", objective.in = z, const.mat = A, const.dir= dir, const.rhs = B, all.int=T)
opt #86
opt$solution #0 0 0 0 2

-

추억의 선형계획법ㅎㅎ 대학원에서 최적화 및 시뮬레이션 수업 들을 땐 엑셀로 최적해 찾는거 보면서 언제적 엑셀..했는데 R에 이런 library가 있구나
(최적화 및 시뮬레이션 보따리: 컨설팅펌 인터뷰 볼 때 과목 이름 보고 멋진 수업 들으셨네~하면서 배웠던 내용을 아주 무자비하게 물어보셨는데 실제 수업 내용은 엑셀..최적화..해찾기..뿐이라 쭈글거렸던 기억이 있다. 생각해보면 툴만 그랬다 뿐이지 내용은 나름 있었던 것 같기도..별로 안좋아하는 수업이었지만 남는게 없진 않았넵)

댓글