在这篇文章中,将探讨如何通过动态规划来解决复杂的优化问题。动态规划是一种将复杂问题分解为更简单的子问题,并通过记忆化存储这些子问题的解决方案的方法。这种方法在运筹学中广为人知,但在实际应用中却鲜为人使用。本文将通过一个出租车替换的案例研究,来展示动态规划的艺术,并使用R语言实现,以便读者能够获得实际的编程经验。
假设决定创办一家出租车运营公司,并计划在下周与顶级投资者会面,展示商业计划。计划重点应该是未来25年的预期年收入以及增长策略。一个关键的决策是考虑或估计更换汽车的时间。知道,不能永远运营同一辆出租车。准确地说,一辆汽车(出租车)不能使用超过10年。此外,不允许购买二手车。
计划总共运营100辆汽车,但为一辆汽车进行计算就足够了。以下是需要在本案例研究中做出的假设:
初始出租车费用:12卢比
汽车残值增加:1%
全新汽车成本增加:5%
年需求增长:3%
出租车费用增加:4%
成本(维护和燃料)增加:2%
动态规划/优化是一种通过将复杂问题分解为一系列更简单的子问题来解决复杂问题的方法,每个子问题只解决一次,并将它们的解决方案存储起来——理想情况下,使用基于内存的数据结构。
让为当前问题定义一个简单的优化函数。试图优化当前问题的利润,利润由以下公式给出:
Profit(t) = Demand(t) * (Cab Fare(t) - Cost(t)) + Sell of flag * (NewCarCost - SalvageValue(t))
Total Profit = Profit(t) + Profit(t+) + Profit(t-)
Sell of flag是决定是否出售汽车的决策变量。应该注意到这个函数中的所有值都依赖于时间。那么,从哪里开始解决这个问题呢?从最后一个时间点开始。原因是,在最后一个时间点,没有任何对未来时间点的依赖。例如,在最后一个时间点(l),知道:
Profit(l) = Demand(l) * (Cab Fare(l) - Cost(l)) + Sell off flag * (NewCarCost - SalvageValue(l))
并且,
Profit(l-1,l) = Demand(l-1) * (CabFare(l-1) - Cost(l-1)) + Sell off flag * (NewCarCost - SalvageValue(l-1)) + Max(Profit(l))
Max(Profit(l))是决策变量“Sell off flag”的最大利润值。
可以使用以下R代码解决手头的问题:
# 基本假设
> Demand <- c(50000,49000,48000,47000,46000,45000,44000,43000,42000,41000,40000)
> cost <- c(3.1,3.3,3.6,4,4.5,5,5.6,6.3,7,8,9)
> Salvage<-c(1000000,600000,500000,400000,350000,300000,250000,200000,150000,130000,100000,0)
# 通货膨胀率
> Salvagegrowth <- 1.01
> InitialCostgrowth <- 1.05
> Demandgrowth <- 1.03
> cabfaregrowth <- 1.04
> costinggrowth <- 1.02
# 构建动态规划函数
> findpath <- function(time){
...
}
findpath(time = 25)
这是得到的最终输出,用于决定保留或出售汽车:
此外,让看看最优收入矩阵:
如所见,第一个单元格的总收入是22.4百万卢比,这是根据目前的假设,一辆汽车在25年内预期的最大利润。因此,100辆汽车的总预期利润将是100 * 22.4百万 = 2.24亿卢比。
使用相同的分析,让尝试回答几个更多的问题。
从第一个表中可以看出,有4个周期。因此,需要1辆原始车和3辆替换车来满足每辆车的需求。第一辆车停留7年,第二辆车停留7年,第三辆车停留6年,最后一辆停留5年。因此,这里的汽车最大年龄是7年。
要找到按年份计算的利润现值,以下是表格:
因此,现值中的最大利润发生在第21年。