Вы можете установить это как задачу линейной оптимизации.Вы пытаетесь максимизировать количество баллов с учетом временных ограничений.Кроме того, каждая переменная принятия решения должна быть двоичной, поскольку вы не можете ответить на один и тот же вопрос дважды.
lpSolveAPI
- это пакет R. для решения этих проблем.Честно говоря, я нахожу синтаксис немного плотным, но очень мощным.Мне удалось найти 50-балльное решение, которое занимает все 50 минут.FWIW, я нашел то же решение в Excel Solver()
, что, на мой взгляд, немного более интуитивно.
Полное решение приведено ниже, но вот представление модели, которую мы настроили (этовывод из write.lp()
после настройки модели:
/* Objective function */
max: +21 Q1 +5 Q2 +10 Q3 +14 Q4 +5 Q5 +5 Q6 +10 Q7 +5 Q8 +5 Q9;
/* Constraints */
Time_Constraint: +24 Q1 +7 Q2 +15 Q3 +12 Q4 +4 Q5 +3 Q6 +10 Q7 +5 Q8 +6 Q9 <= 50;
/* Variable bounds */
Q1 <= 1;
Q2 <= 1;
Q3 <= 1;
Q4 <= 1;
Q5 <= 1;
Q6 <= 1;
Q7 <= 1;
Q8 <= 1;
Q9 <= 1;
/* Integer definitions */
int Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q8,Q9;
library(lpSolveAPI)
library(data.table)
#Define questions, points, and time requirements
dt <- data.table(questions = paste0("Q", 1:9), points = c(21,5,10,14,5,5,10,5,5), time = c(24,7,15,12,4,3,10,5,6))
#make lp object with one contrasint and 9 decision variables
lprec <- make.lp(1,9)
#make sure we're maximizing, not minimizing
lp.control(lprec,sense='max')
#Set the names
dimnames(lprec) <- list("Time_Constraint", dt$questions)
#Set the objective function values, i.e. how many points we get
set.objfn(lprec, dt$points)
#assign the time taken to earn the points
set.row(lprec, 1, dt$time)
#what is the right hand side variable to 50
set.rhs(lprec, 50)
#make the variables binary
set.type(lprec, columns = 1:9, "binary")
#write this model out to see what it is
write.lp(lprec, filename = "model.lp", type = "lp")
#solve the model
solve(lprec)
#> [1] 0
#get the answers, i.e. which should be answered
answers <- get.variables(lprec)
#let's subset just the questions we should answer
dt[as.logical(answers), ]
#> questions points time
#> 1: Q1 21 24
#> 2: Q4 14 12
#> 3: Q5 5 4
#> 4: Q7 10 10
#and confirm that we don't go over 50 minutes
dt[as.logical(answers), .(points = sum(points), time_taken = sum(time))]
#> points time_taken
#> 1: 50 50
Создан в 2019-02-10 пакетом Представить (v0.2.1)