Nonlinear discrete optimization in R

前端 未结 4 1670
执念已碎
执念已碎 2021-01-20 19:17

I have a simple (indeed standard in economics) nonlinear constrained discrete maximisation problem to solve in R and am having trouble. I found solutions for pa

4条回答
  •  轮回少年
    2021-01-20 19:20

    1) no packages This can be done by brute force. Using df from the question as input ensure that price is numeric (it's a factor in the df of the question) and calculate the largest number mx for each variable. Then create grid g of variable counts and compute the total price of each and the associated objective giving gg. Now sort gg in descending order of objective and take those solutions satisfying the constraint. head will show the top few solutions.

    price <- as.numeric(as.character(df$price))
    mx <- ceiling(20/price)
    g <- expand.grid(ana = 0:mx[1], ban = 0:mx[2], cook = 0:mx[3]) 
    gg <- transform(g, total = as.matrix(g) %*% price, objective = sqrt(ana * ban * cook))
    best <- subset(gg[order(-gg$objective), ], total <= 20)
    

    giving:

    > head(best) # 1st row is best soln, 2nd row is next best, etc.
         ana ban cook total objective
    1643   3   9    5 19.96  11.61895
    1929   3   7    6 19.80  11.22497
    1346   3  10    4 19.37  10.95445
    1611   4   6    5 19.88  10.95445
    1632   3   8    5 19.21  10.95445
    1961   2  10    6 19.88  10.95445
    

    2) dplyr This can also be nicely expressed using the dplyr package. Using g and price from above:

    library(dplyr)
    g %>% 
      mutate(total = c(as.matrix(g) %*% price), objective = sqrt(ana * ban * cook)) %>%
      filter(total <= 20) %>%
      arrange(desc(objective)) %>%
      top_n(6)
    

    giving:

    Selecting by objective
      ana ban cook total objective
    1   3   9    5 19.96  11.61895
    2   3   7    6 19.80  11.22497
    3   3  10    4 19.37  10.95445
    4   4   6    5 19.88  10.95445
    5   3   8    5 19.21  10.95445
    6   2  10    6 19.88  10.95445
    

提交回复
热议问题