使用lpSolve和for循环解决r中的最大化问题吗?

时间:2018-10-30 23:02:32

标签: r

我是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周的保险(即,所覆盖的汽车数量每周之间都不能变化)。根据我们选择购买保险的汽车数量,我们可以相当容易地确定车队的汇总范围。例如,如果我们在10个星期内覆盖18位审计师,则该车队的总覆盖率将为18 x 10 /(20 + 20 + 21 + 21 + 21 + 20 + 19 + 22 + 22 + 22 + 22)= 86.1%

现在考虑递增保险的范围。例如,如果我们覆盖第19个audi,则它覆盖了所有10周的汽车(因为每周至少有19辆汽车),因此增量覆盖率为100%。如果我为20位审计师投保,则该保险为10周中的9周(除了第6周之外的所有车辆)提供了汽车保险,因此增量险种为90%。如果我为21st审计提​​供保险,则该保险将为10周中的6周提供汽车保险(由于在1,2,5,6周内有<21辆汽车要出租),因此增量保险为60%。

对于每辆汽车,我正在尝试确定要保证的最大汽车数量,以使向该政策添加汽车的增量覆盖率大于该汽车给定的收支平衡覆盖率

我这样思考问题:

目标:最大化numCarsToInsure

约束:incrCoverage >= breakevenCoverage,其中incrCoverage

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

(作为求解的一部分,应针对numCarsToInsure的每个值评估上述循环)

对于奥迪,numCarsToInsure应该为20,增量为90%。如果NumCarsToInsure为21,则incCoverage下降至60%,即<收支平衡点为71%。对于特斯拉,numCarsToInsure应该为12,其中incCoverage为100%。如果numCarsToInsure为13,则incCoverage降至0%,即

lpSolve解决方法正确吗?如果是这样,如何使用lp()函数为for循环建模?

另一种方法是从numCarsToInsure = 0开始,求解incrCoverage,与breakevenCoverage比较,然后继续递增numCarsToInsure并解决直到incrCoverage下降到breakevenCoverage以下。但是,我希望r具有某种优雅的解决功能,与手工制作相比能做到这一点。

如果我能弄清楚如何解决一个给定的观察值,我就能弄清楚整个数据框,但是解决整个数据框的代码将非常有帮助。

谢谢!

1 个答案:

答案 0 :(得分:0)

感谢您提出问题。我认为您不需要任何形式的优化即可执行此最大化。当然不是lpSolve或乐观主义者。您仅需保证额外的汽车(数量,没有汽车的零头),直到您达到或超过盈亏平衡点为止。为此,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

如果您有任何疑问,请告诉我。