Решение проблемы максимизации в r с помощью lpSolve с циклом for? - PullRequest
0 голосов
/ 31 октября 2018

Я новичок в r и пытаюсь решить следующую проблему максимизации.

Рассмотрим следующий кадр данных:

cars week1 week2 week3 week4 week5 week6 week7 week8 week9 week10 breakevenCoverage audi 20 20 21 21 20 19 22 22 22 22 0.71 tesla 12 12 12 12 12 12 12 12 12 12 0.74 bmw 12 12 12 12 12 13 13 13 13 13 0.73 toyota 1 1 1 1 1 1 1 1 0 0 0.71 honda 6 6 7 7 7 7 7 8 8 8 0.71

Допустим, это число автомобилей, которые компания по прокату автомобилей может арендовать в течение 10 недель. Нам нужно покрыть автомобили страховкой, но страховку можно приобрести только на 10-недельный блок (то есть количество покрываемых автомобилей не может меняться неделя за неделей). Исходя из того, сколько автомобилей мы решили покрыть страховкой, мы можем довольно легко определить совокупный охват автопарка. Например, если мы охватим 18 аудитов за 10-недельный период, совокупный охват парка будет 18 x 10 / (20 + 20 + 21 + 21 + 20 + 19 + 22 + 22 + 22 + 22) = 86,1% .

Теперь рассмотрим добавочное покрытие страхования дополнительного автомобиля. Например, если мы охватываем 19-ю аудиторию, она покрывает автомобиль на протяжении всех 10 недель (поскольку каждую неделю насчитывается не менее 19 автомобилей), поэтому дополнительный охват составляет 100%. Если я покрываю 20-ю аудиторию, страховка покрывает автомобиль в течение 9 из 10 недель (все, кроме недели 6), поэтому дополнительный охват составляет 90%. Если я покрываю 21-ю аудиторию, страховка покрывает автомобиль на 6 из 10 недель (поскольку на 1, 2, 5, 6 неделях в аренду входит <21 автомобиль), поэтому дополнительное покрытие составляет 60%. </p>

Для каждого автомобиля я пытаюсь определить максимальное количество страхуемых автомобилей, чтобы добавочное покрытие при добавлении автомобиля к полису равнялось> = данному покрытию безубыточности для этого автомобиля.

Я думаю о проблеме следующим образом:

Цель: максимизировать numCarsToInsure, где

Ограничения: incrCoverage >= breakevenCoverage, где incrCoverage равно

for i = 1 to 10 if week[i] >= numCarsToInsure then Covered = Covered + 1 incrCoverage = Covered / 10

(вышеуказанный цикл должен быть оценен для каждого значения numCarsToInsure как часть решения)

Для audi значение numCarsToInsure должно быть равно 20, а охват - 90%. Если NumCarsToInsure равно 21, охват уменьшается до 60%, что составляет <безубыточное покрытие 71%. Для tesla значение numCarsToInsure должно быть равно 12, а охват - 100%. Если numCarsToInsure равно 13, охват уменьшается до 0%, что составляет <безубыточное покрытие 74%. И пр. </p>

Является ли lpSolve правильным подходом? Если да, то как мне смоделировать цикл for с помощью функции lp ()?

Другой подход заключается в том, чтобы начать с numCarsToInsure = 0, решить для incrCoverage, сравнить с breakevenCoverage, а затем продолжать увеличивать numCarsToInsure и разрешать, пока incrCoverage не опустится ниже безубыточного покрытия. Но я надеюсь, что у r есть какая-то элегантная функция решения, которая делает это против ручного крафта.

Если я могу выяснить, как решить для данного наблюдения, я могу выяснить весь фрейм данных, но код, который решает для всего фрейма данных, был бы очень полезен.

Спасибо !!

1 Ответ

0 голосов
/ 31 октября 2018

Спасибо, что удалили ваш вопрос. Я не думаю, что вам нужна какая-либо форма оптимизации для выполнения этой максимизации. Конечно, не lpSolve или Optim. Вы страхуете только дополнительный автомобиль (целое число, без доли автомобиля) до тех пор, пока не достигнете или превысите уровень безубыточности. Для этого будет достаточно while цикла:

# reproducible dataset - best practice is to use dput(yourData) to generate this
dat <- data.frame(
  cars = structure(c(1L, 4L, 2L, 5L, 3L), .Label = c("audi", "bmw", "honda", 
                                                     "tesla", "toyota"), class = "factor"),
  week1 = c(20L, 12L, 12L, 1L, 6L),
  week2 = c(20L, 12L, 12L, 1L, 6L),
  week3 = c(21L, 12L, 12L, 1L, 7L),
  week4 = c(21L, 12L, 12L, 1L, 7L),
  week5 = c(20L, 12L, 12L, 1L, 7L),
  week6 = c(19L, 12L, 13L, 1L, 7L),
  week7 = c(22L, 12L, 13L, 1L, 7L),
  week8 = c(22L, 12L, 13L, 1L, 8L),
  week9 = c(22L, 12L, 13L, 0L, 8L),
  week10 = c(22L, 12L, 13L, 0L, 8L),
  breakevenCoverage = c(0.71, 0.74, 0.73, 0.71, 0.71),
  stringsAsFactors = FALSE)

# I like to initialize all my empty objects 
dat[,"covered"] <- 0 # initialize the column we will fill with results
dat[,"coveredPercent"] <- 0
coveredPercent <- 0

for(i in 1:nrow(rawdat)){ # for each car
  covered = 0 # start at zero
  coveredPercent = 0
  while(coveredPercent < rawdat[i, "breakevenCoverage"]){
    covered <- covered + 1 
    coveredPercent <- covered*10/sum(dat[i, 2:11])
  }
  dat[i, "covered"] <- covered
  dat[i, "coveredPercent"] <- coveredPercent
}
dat

Который показывает результат:

    #cars week1 week2 week3 week4 week5 week6 week7 week8 week9 week10 breakevenCoverage covered coveredPercent
#1   audi    20    20    21    21    20    19    22    22    22     22              0.71      15      0.7177033
#2  tesla    12    12    12    12    12    12    12    12    12     12              0.74       9      0.7500000
#3    bmw    12    12    12    12    12    13    13    13    13     13              0.73      10      0.8000000
#4 toyota     1     1     1     1     1     1     1     1     0      0              0.71       1      1.2500000
#5  honda     6     6     7     7     7     7     7     8     8      8              0.71       6      0.8450704

Дайте мне знать, если у вас есть какие-либо вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...