[R] Optimizing

Gabor Grothendieck ggrothendieck at gmail.com
Sat Nov 17 17:06:55 CET 2012


On Wed, Nov 14, 2012 at 8:23 PM, Sam Asin <asin.sam at gmail.com> wrote:
> Hello,
>
> I am fairly new with R and am having trouble finding an optimal group.  I
> checked the help functions for the various optimize commands and it was a
> little over my head.
>
> I have a dataset with 4 columns, name, type, value, and cost.  The set
> consists of a list of people, which have 3 types.  I want to choose 6
> people, two of each type, and maximize the sum of their values.  However,
> I'm subject to the constraint that the wage of the three people has to sum
> to less than 20 dollars.  Here is some sample data.
>
> people <- c("A", "B", "C", "D", "E", "F", "G", "H", "I")
> type<- c(1, 1, 1, 1, 2, 2, 3, 3, 3)
> value<-c(25.20, 24, 38, 20, 14, 20, 31, 11, 8)
> wage<- c(4, 3.8, 5.1, 3.5, 2.4, 3, 6, 2.4, 2)
>
> data<- data.frame(people, type, value, wage)
>
> With this small dataset the question isn't very interesting, but the answer
> would be something like person C, D, E, F, G, and I (I didn't check to see
> that those prices sum to less than $20).
>
> How can I write a program that will do this?  Can I just use the optimize
> command?  Do I have to transform my dataset into something that is easier
> to use the optimize command on?  Or should I write my own code that does
> the process?
>

This can be formulated as an integer programming problem. Note that
the proposed solution in your post is infeasible as it violates the
wage constraint.

library(lpSolve)

people <- c("A", "B", "C", "D", "E", "F", "G", "H", "I")
type<- c(1, 1, 1, 1, 2, 2, 3, 3, 3)
value<-c(25.20, 24, 38, 20, 14, 20, 31, 11, 8)
wage<- c(4, 3.8, 5.1, 3.5, 2.4, 3, 6, 2.4, 2)

con.mat <- rbind(type == 1, type == 2, type == 3, wage)
con.dir <- c("==", "==", "==", "<=")
con.rhs <- c(2, 2, 2, 20)
binary.vec <- seq_along(people)
out <- lp("max", value, con.mat, con.dir, con.rhs, binary.vec = binary.vec)
out$solution #  1 0 1 0 1 1 0 1 1
people[out$solution == 1] # "A" "C" "E" "F" "H" "I"
out # 116.2

# note: proposed solution in post violates wage constraint
proposed.soln <- c("C", "D", "E", "F", "G", "I")
crossprod(wage, people %in% proposed.soln) # 22


--
Statistics & Software Consulting
GKX Group, GKX Associates Inc.
tel: 1-877-GKX-GROUP
email: ggrothendieck at gmail.com




More information about the R-help mailing list