百篇读文计划|第一篇:利用分支定价切割算法精确求解单向汽车共享系统中的E-VReP

各位uu大家好啊!

今天在这里给大家分享一下Branch-and-price-and-cut(BPC)求解单向汽车共享系统中的E-VReP。

预计读完只需 8分钟 !

嘿嘿嘿,那我们就开始叭 ~~~

1. 前言


1.1 E-VReP

The Electric Vehicle Relocation Problem , E-VReP 是一种近十年比较火的运筹优化问题,主要应用于共享电动汽车系统中,是 NP-hard 问题。

随着共享电动汽车系统越来越普及,车辆的合理调度和重新定位渐渐变得重要,以保证车辆在各个站点的可用性,从而满足用户的需求。

这里我们通常要考虑几个关键问题:

  1. 有多少辆车?它停在哪里?还剩多少电?
  2. 城市中有多少个停车站点?每个站点能不能充电?
  3. 充电时间和充电站容量分别是多少?
  4. 能不能满足用户的需求?还有系统的运营要求?(时间窗)
  5. 是不是要分析和预测用户需求的变化,确保在高需求区域有足够的车辆供应呢?
  6. 车辆移动的成本和充电成本怎么算呢?

1.2 单向汽车共享系统

单向汽车共享系统(One-Way Carsharing Systems)是一种创新的共享出行方式,它允许用户在一个地点取车并在不同的地点还车,而不必将车辆归还到原来取车点。这种系统提供了更大的灵活性便利性,尤其适合城市内短途出行和多地点间的旅行。

例如:我在南京取车去西藏旅游,开到一半很累,可以停在武汉的停车点,坐火车过去,不用返回南京归还。

现在这个系统有几个值得研究解决的问题:

  1. 由于用户的单向租赁行为,某些区域可能会出现车辆供需不平衡,怎么可以对车辆进行再平衡和调度呢?
  2. 需要确保车辆停放在合法和安全的位置,并避免占用过多的公共停车资源,应该怎么控制好停车管理呢?
  3. 没有足够的充电桩,怎么确保车辆在不同地点都能充电呢?


1.3 单向汽车共享系统中的 E-VReP

我们可以透过以下小故事理解本文的问题~~~

在某个忙碌的城市,每到工作日的早晨,住宅区的停车站一大早就被用户取车赶往商业区,导致住宅区车辆很快短缺,而商业区车辆过剩。为了应对这个问题,电动汽车共享服务提供商雇佣了一组员工来重新安置车辆。每天早上,这些员工在城市中心的仓库集合,骑着折叠自行车出发,按照计划处理多个取车和送车请求。

李师傅是这支团队的一员。今天,他需要从东城区的住宅区取走三辆车,然后将它们送到西城区的三个办公区停车站。他熟练地将自行车放入第一辆车的后备箱,开车前往第一个送车地点。一路上,他穿过晨光中的街道,感受着城市苏醒的气息。在办公区停车站,李师傅停好车,拿出自行车,骑向下一个取车点。整个上午,他在城市的不同角落来回穿梭,及时将车辆分布到需要的地方。

完成任务后,李师傅骑着自行车回到仓库,看着停车站恢复平衡,他心中充满了满足感。通过这些员工的努力,城市的电动汽车共享系统得以高效运行,为市民提供便捷的服务。

不知道大家看明白了没有哈~~~

具体来说,取车请求是指需要将车辆从当前站点移走,而送车请求是指某站点需要车辆。员工先骑车到取车站,将折叠自行车放入电动汽车后备箱,然后驾驶电动汽车到送车站完成任务。需要注意的是,在规划过程中,一个停车站可能会有多个取车和送车请求。即使这些请求位于同一个站点,它们也被视为不同的实体。因此,员工可以多次访问同一个站点,但每个 取车/送车 请求最多只能得到一次服务。

这个系统有几个限制:

  1. 每个取货和送货请求都有一个预定义的时间窗口,工作人员必须在这个时间窗口内完成任务。
  2. 如果电动汽车的电量不足以到达目标车站或到达后电量低于送车请求所需的电量,则无法将车辆配送到该车站。
  3. 每个工人可以在不同的时间开始工作,但他们的工作时间有最长限制

以上的问题,大家一起想一想哈~~~


2. 问题描述


E-VReP 定义在有向图 G = ( V , A ) G = (V, A) G=(V,A) 上,其中 V = { 0 , n + 1 } ∪ P ∪ D V = \{ 0, n + 1 \} ∪P∪D V={0,n+1}PD 是节点集, A = { ( i , j ) ∣ i , j ∈ V , i = j } A = \{(i, j)|i, j ∈ V, i = j\} A={(i,j)i,jV,i=j} 是一个弧集。节点 0 0 0 n + 1 n + 1 n+1 称为起始节点和目标节点,分别代表出现在路线 起点 和 终点 的两个虚拟节点。

节点子集 P P P 表示需要将电动汽车移至其他停车站的取车请求集合, D D D 表示工作人员交付电动汽车以防止某些停车站车辆耗尽的交付请求集合。

每条距离为 d i , j d_{i,j} di,j 的弧线 ( i , j ) ∈ A (i,j)∈A (ij)A 分别具有固定的EV行驶时间 π i , j π_{i,j} πi,j 和骑行时间 h i , j h_{i,j} hi,j

工作人员将自行车 放入/取出 后备箱会产生服务时间 s i , j s_{i,j} si,j ,并且对每个节点 i ∈ V i ∈ V iV 施加一个时间窗口 [ e i , l i ] [e_{i}, l_{i}] [ei,li],其中 e i e_{i} ei l i l_{i} li 表示最早时间和允许服务请求 i i i 的最晚时间。

如果早于 e i e_{i} ei,工人必须在节点 i i i 等待,直到到达 e i e_{i} ei ,如果晚于 l i l_{i} li 到达,则不允许他们进行搬迁。以代接节点 i i i 为例, e i e_{i} ei 之前的时间表示该EV不可用,而 l i l_{i} li 之后的时间表示该 EV 可以被用户 保留/使用。

为了简单起见,让 s 0 = s n + 1 = 0 s_{0} = s_{n+1} = 0 s0=sn+1=0 ;让 e 0 = e n + 1 = 0 e_{0} = e_{n+1} = 0 e0=en+1=0 l 0 = l n + 1 = H l_{0} = l_{n+1} = H l0=ln+1=H ,因此,the planning horizon H H H 等于车辆段时间窗口的长度。对于配送节点 j j j ,令 ρ j ρ_{j} ρj 表示 EV 在时间 l j l_{j} lj 时必须具有的最小剩余电池电量。然而,我们允许在 l j l_{j} lj 之前交付电池电量低于 ρ j ρ_{j} ρj 的电动汽车,前提是在 l j l_{j} lj 时至少达到 ρ j ρ_{j} ρj ,因为电池在交付后可以充电。对于拾取节点 i i i ρ i ρ_{i} ρi 表示在时间 e i e_{i} ei 时 EV 的当前电池电量。

为每个搬迁请求分配相应的收入,我们仅将交付请求 i ∈ D i ∈ D iD 与收入 r e v i rev_{i} revi 相关联。这是因为,只有完成电动汽车的交付,才能收钱,系统才能实现盈利。假设有一个由同质工人组成的团队,每个工人都有最长工作时间 T T T 和雇佣成本 C C C ,他们可以在不同时间离开仓库以满足不同的请求。工人驾驶电动汽车从取货节点到送货节点,除此之外,他们必须骑自行车在以下路径之间移动:
从仓库到取货节点 → 从送货节点到下一个取货节点 → 再从最终的送货节点返回仓库。

上述假设图中,虚线表示从仓库到取货节点从最终的送货节点返回仓库 20 20 20 分钟。实线表示从送货节点到下一个取货节点 12 12 12 分钟。橘色矩形代表电量 ρ ρ ρ 的变化,被取走的电动汽车的电池电量会有可能低于交付的电动汽车所需的电量。在分配给 W 1 W_{1} W1 的路线中, 13 : 30 13:30 13:30 P 2 P_{2} P2 处的电动汽车的电池电量为 0.8 0.8 0.8,而 13 : 30 13:30 13:30 D 1 D_{1} D1 处所需的最低电池电量为 0.9 0.9 0.9。电动汽车在 D 1 D_{1} D1 13 : 43 13:43 13:43 交付,电池电量为 0.77 0.77 0.77,因为从 P 2 P_{2} P2 D 1 D_{1} D1 的电池消耗为 5 / 150 = 0.03 5/150=0.03 5/150=0.03 。虽然是这样,在 D 1 D_{1} D1 最晚时间,即 14 : 30 14:30 14:30 ,电动汽车通过充电可以达到 0.97 > 0.9 0.97 > 0.9 0.97>0.9 的电池电量。从 13 : 43 13:43 13:43 14 : 30 14:30 14:30 47 47 47 分钟),电池电量增加了 47 / 240 = 0.2 47/240=0.2 47/240=0.2 ,因为电动汽车在不使用时始终连接到充电底座。

E-VReP 的目标是最大化总利润,这等于所服务的交付请求所获得的总收入减去规划期间雇用工人所产生的总成本。每个工人最多可以执行一条路线,如果这条路线从仓库开始并结束于仓库,且在规定的时间 T T T 内完成一系列取货和送货请求,则该路线被认为是可行的。每个请求只能被服务一次,任何时候均不可重复服务同一个请求。

!!请注意!!

电池电量会缩小服务开始时间 α i α_{i} αi β j β_{j} βj 的可行范围,这可能不再是原始时间窗口 [ e i , l i ] [e_{i}, l_{i}] [ei,li] [ e j , l j ] [e_{j}, l_{j}] [ej,lj]。文中通过了对约束条件的推导,得出取货节点 i i i 的服务开始时间的可行域 [ χ i , j p , ω i , j p ] [χ_{i,j}^{p}, ω_{i,j}^{p}] [χi,jp,ωi,jp] 和配送节点 j 的另一个可行域 [ χ i , j d , ω i , j d ] [χ_{i,j}^{d}, ω_{i,j}^{d}] [χi,jd,ωi,jd]


❗ ❗不要因为看到复杂的数学符号就怕了不敢读下去,其实他只是个符号,跟我们平时用的 x x x y y y 是一样的❗ 读到这里已经很棒了,还有一半,加油❗❗


3. 算法流程


3.1 Column generation

Column generation 是一个不停迭代的算法。在每次迭代中,我们需要依次解决主问题的受限线性松弛 RLMP 和定价子问题。RLMP 是一个包含部分决策变量(就是我们所说的)的受限主问题,由于其规模适中,可以直接使用单纯形算法求解。定价子问题则用于查找可能添加回 RLMP 的潜在列。

这里有个点需要大家注意一下,原始问题是一个最大化问题,所以潜在指的是那些相对于 RLMP 的对偶解具有正降低成本的列。如果我们无法识别出这样的列,则 RLMP 的最优解也是原始 LMP 的最优解,Column generation 就会停止

问题又来了,既然这些列这么重要,那怎么才能找到?

3.1.1 Label-setting algorithm

在这里我们会简单介绍一下Label-setting algorithm 标签设置算法(想要加深了解还是要看看相关文献),这个动态规划方法的算法经常用在带资源约束的基本最短路径问题,ESPPRC,旨在寻找成本降低的可行路径。在这个算法中,每个状态可以被设计为标签,它表示从仓库到某个节点且不违反任何资源约束的部分路径。

算法从一些初始标签开始,通过所有可行的弧逐步扩展标签,直到没有可行的扩展为止。通过这种标签的传播,可以枚举出所有可行路径,从而确保找到成本降低最大的最优路径。

为了提高算法效率,文中使用优势策略来丢弃一些不会导致最优路径的劣质标签,减少扩展时的标签数量。这不仅加快了算法运行速度,还确保在合理时间内找到最优解。

而在这里,文中使用了带有双向搜索的标签设置算法来针对解决定价子问题。

有的小伙伴可能就会说~~我们不是要找列吗??关标签设置算法什么事呢?

  • 而在这里标签设置算法所找出的可行路径就是我们要找的 !!

上述的带有双向搜索的标签设置算法的搜索过程包括三个步骤:

  1. 从源节点(即 depot 0 0 0向前扩展标签;
  2. 从目标节点(即 depot n + 1 n + 1 n+1向后延伸标签;
  3. 如果可能的话,将与同一节点连接的前向和后向标签对合并在一起以形成可行的完整路径。

3.1.2 最短持续时间函数

为了优化工人路线,通过延迟出发时间来减少请求节点的等待时间和总路线持续时间。解决过程中,采用了最小持续时间函数来计算和确定最佳出发时间,同时使用双向搜索技术进行路线规划,从而在不违反时间窗口的情况下优化工人路线。

这里我们定义前向最小持续时间函数为 Φ f k ( t ) \Phi_{f}^{k}(t) Φfk(t) ,这个函数可以通过计算函数 δ f k ( t ) δ_{f}^{k}(t) δfk(t) 的三种情况来获得。

  1. 第一种情况:没有等待时间

    • 如果所有访问请求的时间窗口不紧,车辆可以在没有等待时间的情况下出发。
    • 具体而言,车辆段的发车时间 t t t 减去所需的持续时间(包括服务时间和行驶时间)等于在节点 v k v_{k} vk 启动服务的时间。
  2. 第二种情况:允许 slack time

    • 允许生成一个 slack time ,车辆可以延迟出发,但仍然能在服务请求的时间窗口内完成任务。
    • 如果工人提前到达请求地点,可以减少 slack time以避免等待。
  3. 第三种情况:紧张的时间窗

    • 如果存在紧张的时间窗访问请求,可能无法完全消除等待时间。
    • 此时,slack time 主要取决于每个先前请求的到达时间与最晚时间窗口之间的差异。

我们可以很直观的看一下下图:

上图假设工作人员从仓库出发,进行每种情况的一对 p-d(取货-交货)服务
使用粗线虚线分别表示必要的持续时间等待时间

很显然我们可以知道,slack time 在不同情况下的作用和限制,特别是在处理紧张的时间窗时,等待时间无法完全由 slack time 补偿。

为了加速列生成过程,文中采用了一些以下两种加速技术来提速。

3.1.3 加速技术

1. 递减状态空间(DSS)松弛

这是一种用于加速 ESPPRC 标签设置算法的方法。它通过允许在初始步骤中每个请求被多次访问,可以快速找到最优解决方案。

  • 如果最优解决方案中没有请求被多次访问,那么该解决方案也适用于原始问题。

  • 如果存在多次访问的请求,则这些请求被添加到集合 N ^ \hat{N} N^ 中,重新运行算法并施加新的限制,使这些请求最多只能被访问一次。

这样可以逐步优化并加速求解过程,然后再通过重复上述过程,逐步优化解决方案。

每次迭代都希望找到一条能够降低总成本的路径(即具有正折减成本的路径 → 正折减)。如果找不到这样的路径(所有路径的折减成本都是负的 → 负折减),说明无法进一步优化,总成本已经无法再降低,这时过程就终止。

这两种情况都标志着找到最优或接近最优的解决方案。


2. 启发式列生成算子

为了加速定价步骤,文中作者们开发了一种启发式松弛标签设置算法。这种方法通过忽略对访问请求的检查,丢弃前向和后向优势规则中的相关条件,减少了标签,从而能够快速找到成本显著降低的列(正折减)。

然而,这种方法不能保证每次都会得到成本正折减的列。如果没有得到成本正折减的列,将会切换到精确的标签设置算法。类似的启发式列生成器已成功应用于各种路径问题,比如车辆路径问题和团队定向问题。

请注意,DSS 松弛仅在应用精确标签设置算法来解决定价子问题时使用


3.2 分支定价切割算法 Branch-and-price-and-cut algorithm, BPC

算法的特点是每个节点通过调用列生成过程解决线性规划松弛问题 (LMP),以获取上限值。如果得到的解是分数(非整数)的,则需要执行分支。

在分支之前,算法会尝试找到并添加有效不等式来收紧松弛的gap,提高求解精度。这种方法在分支定界过程中不断改进解的质量,最终找到最优解。

在这里相信大家看出来,其实这里所谓的有效不等式就是改进解质量的重中之重,就是割平面法中的,通常大家都会把问题画出一个欧几里得空间的图像,然后在可行域上切割,这个就是能直观理解的方法之一。有了这个割使得分支定价算法能提高速度的快速找到最优解。

3.2.1 有效不等式

定义有效的子集行不等式为: ∑ r ∈ R ξ r , S θ r ≤ 1 , ∀ S ∈ C , ∣ S ∣ = 3 \sum_{r∈R}ξ_{r,S}θ_{r} ≤ 1, ∀S ∈ C, |S| = 3 rRξr,Sθr1,SC,S=3 C C C 是子集 S ⊂ N S ⊂ N SN 的集合

∣ S ∣ = 3 |S| = 3 S=3,如果路由 r r r 至少为 S S S 中的两个请求提供服务,则 ξ r , S = 1 ξ_{r,S} = 1 ξr,S=1,否则为 0 0 0

这条不等式其实就是说明了:

  • 在集合 S S S 中服务多个请求的所有路径中,只能选择其中一个路径,否则会导致重复服务某个请求。子集行不等式通过减少完整性差距(即优化问题的松弛解与整数解之间的差距)来改进解的质量,但它也使定价子问题的结构更加复杂,从而增加了求解的难度。

请注意,在求解 LMP 的过程中,最初不考虑子集行不等式。一旦得到初步的最优解后,使用简单的枚举方法来分离出所有违反的子集行不等式。由于处理这些不等式可能非常耗时,为了控制计算复杂度,在每个分支定界节点上对 LMP 生成子集行不等式的次数限制在最多 50 50 50 次切割。这样可以在改进解的质量和控制计算复杂度之间取得平衡。

所以说,能够把有效不等式设计出来,是一个难点,因为它不只是优化了解的质量,而且还要好控制,既要确保这些割不会割走最优解,也要确保计算复杂度不会太高。

3.2.2 分支策略

在分支定界树的探索中,采用最佳优先策略,每个节点的 LMP 解的目标值提供了上界,优先探索上界最紧的节点。当下界等于上限时,算法终止,因为找到了最优解。虽然通常在路径变量 θ r θ_{r} θr 上分支,但设置 θ r = 0 θ_{r} = 0 θr=0 会导致定价子问题变得复杂。

为了避免这种复杂性,文中设计了一种改进的分支策略,使定价子问题的结构不变,可以用与父节点相同的方式解决。在分支定界节点处,按顺序采用两种分支策略以优化算法的效率和可行性。

  1. 第一种策略是在工人数量上进行划分。令 m = ∑ r ∈ R θ r m = \sum_{r∈R}θ_{r} m=rRθr 为当前 LMP 最优解中使用的工人数量。如果该值是小数(非整数),则当前节点分为两个子节点:一个具有约束 ∑ r ∈ R θ r ≤ m \sum_{r∈R}θ_{r} ≤ m rRθrm ,另一个具有约束 ∑ r ∈ R θ r ≥ m \sum_{r∈R}θ_{r} ≥ m rRθrm 。然后,分别让一个子节点中的 u k = m u_{k} = m uk=m 和另一个子节点中的 l k = m l_{k} = m lk=m 。与此约束相关的对偶变量 μ 0 μ_{0} μ0 现在导致无符号,但它仍然是定价子问题的目标函数中的常数。简单来说,这两个子节点处的定价子问题不会对结构产生任何变化,并且可以使用在其父节点处使用的类似算法来处理。请注意,文中优先考虑此分支策略,因为预计它会对解决方案产生重大影响。

  2. 第二种是基于弧流的分支,即根据路线穿过的弧流来进行分支。LMP中删除了一些不可行的路径变量,仅改变子节点处定价子问题的底层图的结构,而不修改标签设置算法。

3.3 具有最短路径持续时间的 E-VReP

本文的目标是最小化所有工作人员的总路径持续时间,那应该如何修改分支定价切割算法的框架以处理 E-VReP 的一个变体呢?

这里假设所有取货请求都必须得到满足,否则最佳值为零。此外,只有当电动汽车被取走并送到停车站时才能获得收入。满足所有取车请求后,系统产生的利润将能够支付总运营成本。这里内容涉及到推导建模,我就不多加说明,建议大家直接看原文!


4. 算法优势


1. BPC算法优于CPLEX(见 Table 3 和 Table 4)
  • 效率:BPC算法在计算有效性和效率方面明显优于CPLEX。BPC可以在不到一分钟内处理小型和中型实例,而CPLEX需要两个小时。
  • 处理能力:CPLEX在处理中等实例时表现不佳,无法证明9个实例的最优性,而BPC算法在时间和解的质量上都优于CPLEX。


2. 完整性差距与线性松弛模型(见 Table 3)
  • 高质量上限:线性松弛模型提供了高质量的上限,LMP值与IP值的平均差距为0.6%、2.6%和2.1%。
  • 子集行不等式的作用:引入子集行削减后,平均差距缩小到0.0%、0.3%和0.8%,表明SR不等式可以有效缩小差距。
3. 大规模实例的处理(见 Table 5)
  • BPC算法最优地解决了12/20个大规模实例,并在4个实例中产生了可行解,尽管有8个实例在时间限制内未能找到最优解。
  • 高质量可行解:比较完整性差距,显示出获得了高质量的可行解,上限通过线性松弛模型给出。

工作持续时间 T T T 对问题有重大影响。我们通过测试一组中等规模的实例,分析不同属性值的变化如何影响结果。使用相同的 BPC 算法求解 E-VReP,Table 6Table 7 显示了参数设置的结果,包括最优值、运行时间、根节点生成标签的数量、服务的 p-d 对数量以及最佳工作人员数量。

当最优解的边际改进微不足道甚至没有改进时,K的影响很小。

Table 7 显示了工作时间限制 T T T 对问题解决的影响。当 T T T 增加时,最优解决的实例数量减少: T = 5 时 T=5时 T=5 20 / 20 20/20 20/20 T = 6 T=6 T=6 时为 20 / 20 20/20 20/20 T = 7 T=7 T=7 时为 16 / 20 16/20 16/20 T = 8 T=8 T=8 时为 14 / 20 14/20 14/20
计算时间随着 T T T 的增加而增加。随着 T T T 的增加,根节点生成标签的平均数量增加,问题变得更难处理。较长的路径持续时间使问题更加复杂,因为路径可以服务更多的对,寻找可行解更困难。延长工作时间会增加利润,但目标是最大化总利润而不是满足的总配对数。例如, T = 7 T=7 T=7 T = 8 T=8 T=8 时,实例“M-15”满足了更多请求对但利润较少,为服务提供商提供了管理参考。

该问题的目标是找到一组使总运营利润最大化的路径。但是,当我们精读完本文后就会发现,所提出的算法还可用于解决问题的另一种变体 → 该问题的重点是最小化总路径持续时间

怎么样?是不是很神奇呢?哈哈哈哈哈是的,这也许就是我们喜欢研究这个领域的原因~~~

今天的分享到这里结束咯。不知道你看明白了吗 ~~~


参考文献:

原论文:

[1] Qin H , Su E , Wang Y ,et al.Branch-and-price-and-cut for the electric vehicle relocation problem in one-way carsharing systems[J].Omega: The international journal of management science, 2022(109-Jun.).

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值